Laravel définit une variable globale pour tous les helpers,contrôleurs et modèles personnalisés

j'ai déjà posé cette question dans codeigniter, maintenant je veux poser à ce sujet dans laravel.

je veux définir une variable globale pour les helpers personnalisés, les modèles et les contrôleurs la variable est obtenue à partir du résultat de la base de données..

Voici l'exemple:

Je ne sais pas où mettre la variable

 $data= DB::table('categories')->where('id', '2')->first();
 $this->product_var = $data->product;  **//main global variable**

helper personnalisé

function test() {
    if($this->product_var=="product name") {

    }
}

mon contrôleur

function index() {
    echo $this->product_var;
}

mon modèle

function get_data() {
     echo $this->product_var;
}

comme vous pouvez voir mes scripts ci-dessus, $this->product_var est presque utilisé pour custom helper , my controller , et my model . dans codeigniter nous créons des Globals.php dans le dossier des bibliothèques, ou tout simplement mettre la variable dans les contrôleurs du noyau. Où dois-je mettre la variable globale?

20
demandé sur Willyanto Halim 2017-05-22 10:38:17

4 réponses

comme @Mozammil mentionné:

l'idée est d'utiliser les"configurations Laravel". Cela vous permet de conserver des valeurs dans la portée globale pour un cycle de requête.

vous pouvez accéder à ces valeurs à travers L'application en utilisant le helper config() de Laravel.

vous avez juste besoin de le mettre une fois comme:

config(['app.product_data' => $data]);

et, ce sera disponible pour vous globalement dans l'application il suffit d'utiliser config('app.product_data') pour accéder aux données.

Comme:

Dans la coutume d'assistance

function test() {
    if(config('app.product_data')->product_var=="product name") {
         //do something
    }

}

votre contrôleur

function index() {
    echo config('app.product_data')->product_var;
}

votre modèle

function get_data() {
     return config('app.product_data')->product_var;
}

J'espère que ça aidera.

8
répondu Parantap Parashar 2017-05-24 11:47:20

Config n'est pas une bonne façon de tenir une variable globale. Comme le suggère le framework, config ne doit contenir que la configuration de votre projet. Et ils doivent être indépendants de la demande.

Laravel offre une bien meilleure façon de gérer les variables globales, vous pouvez utiliser des Singletons. Pourquoi? Parce qu'un singleton tient à l'application un niveau le plus profond, il peut être appelé et disponible à en partie de la demande. Une fois déclaré son assez difficile de changer singleton au milieu de demande.

vous pouvez mettre ce code dans votre AppServiceProvider ou vous pouvez créer votre propre produit Varserviceprovider.

App::singleton('product_var', function(){
     return DB::table('categories')->where('id', '2')->first();
}); 

c'est ainsi que l'on peut être sûr de l'origine de product_var . Plus tard, vous pouvez utiliser la fonction helper app('product_var') n'importe où dans votre code.

vous devez être prudent lorsque vous déclarez des variables globales.

8
répondu anwerj 2017-05-25 12:12:46

j'ai récemment répondu à une question par laquelle l'auteur avait une très belle façon de mettre en cache les valeurs de la table à l'échelle mondiale.

l'idée est qu'il récupérait les valeurs de la table (aussi en cache) et il a fait un paramétrage ServiceProvider pour pouvoir y accéder comme variable de configuration plus tard.

peut-être que ça marcherait très bien pour vous aussi.

3
répondu Mozammil 2017-05-22 09:02:13
Another simplest way to manage multiple data at same time.


     <?php

        namespace App\Utilities;

        class DataBus
        {
            private static $data = [];

            public static function setData($key, $value)
            {
                self::$data[$key] = $value;
            }

            public static function getData($key)
            {
                if(isset(self::$data[$key]))
                {
                    return self::$data[$key];
                }

                throw new \Exception("key is not set");
            }
        }

utilisez-le comme ceci

<?php

namespace App\Xyz;

use App\Utilities\DataBus;


class ABC{

    function setData()
    {
        $data= DB::table('categories')->where('id', '2')->first();

        DataBus::setData('product_var', $data->product);

        // get data by below syntax anywhere in application after setting data.

        DataBus::getData('product_var');
    }
}
2
répondu Pratik Soni 2017-05-29 14:22:29