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?
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.
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.
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.
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');
}
}