Laravel 为所有自定义助手、控制器和模型设置全局变量

我以前在codeigniter中问过这个问题,现在我想在laravel中问这个问题。

我想为自定义帮助程序,模型和控制器设置一个全局变量,该变量是从数据库结果中获取的。

下面是一个示例:

不知道把变量放在哪里

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

自定义助手

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

    }
}

我的控制器

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

我的模型

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

正如你所看到的,我上面的脚本几乎用于 、 和 。在codeigniter中,我们创建Globals.php库文件夹中,或者只是将变量放在核心控制器中。我应该在哪里设置全局变量?$this->product_varcustom helpermy controllermy model


答案 1

就像@Mozammil提到的:

这个想法是使用“Laravel配置”。这允许您在一个请求周期内将值保留在全局范围内。

您可以使用Laravel的帮助程序通过应用程序访问这些值。config()

您只需要像这样设置一次:

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

而且,这将在仅用于访问数据的应用程序中全局可用。config('app.product_data')

喜欢:

在自定义帮助程序中

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

}

您的控制器

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

您的型号

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

希望这会有所帮助。


答案 2

配置不是保存全局变量的好方法。正如框架所建议的那样,配置应该只包含项目的配置。它们应该独立于请求。

Laravel提供了更好的方法来处理全局变量,您可以使用单例。为什么?由于单例将应用程序保持在最深层次上,因此可以在请求的一部分中调用和提供它。一旦声明,在请求过程中更改单例非常困难。

您可以将此代码放在您的 AppServiceProvider 中,也可以创建自己的 ProductVarServiceProvider。

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

这是您可以确定的起源的方式。稍后,您可以在代码中的任何位置使用帮助程序函数。product_varapp('product_var')

声明全局变量时应小心。


推荐