Laravel为所有自定义帮助程序,控制器和模型设置全局变量

Wil*_*lim 21 php codeigniter global-variables laravel-5.4

我曾经在codeigniter问过这个问题,现在我想在laravel中询问这个问题.

我想为自定义帮助器,模型和控制器设置一个全局变量,该变量来自数据库结果.

这是一个例子:

不知道把变量放在哪里

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

自定义助手

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我的控制器

function index() {
    echo $this->product_var;
}
Run Code Online (Sandbox Code Playgroud)

我的模特

function get_data() {
     echo $this->product_var;
}
Run Code Online (Sandbox Code Playgroud)

正如你可以在上面看到我的剧本,$this->product_var几乎用custom helper,my controllermy model.在codeigniter中,我们在libraries文件夹中创建Globals.php,或者只是将变量放在核心控制器中.我应该在哪里设置全局变量?

anw*_*erj 10

Config不是保存全局变量的好方法.正如框架所示,配置应该只包含项目的配置.他们应该独立于要求.

Laravel提供了更好的处理全局变量的方法,你可以使用Singletons.为什么?因为单例保持应用程序最深层次,所以可以在请求的一部分中调用它.一旦声明在请求中间很难更改单例.

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

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

这是你可以确定的起源的方式product_var.稍后您可以app('product_var')在代码中的任何位置使用辅助函数.

在声明全局变量时应该小心.


Par*_*har 8

像@Mozammil一样提到:

我们的想法是使用"Laravel配置".这允许您将值保留在一个请求周期的全局范围内.

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

你只需要设置一次,如:

config(['app.product_data' => $data]);
Run Code Online (Sandbox Code Playgroud)

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

喜欢:

在自定义助手中

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

}
Run Code Online (Sandbox Code Playgroud)

你的控制器

function index() {
    echo config('app.product_data')->product_var;
}
Run Code Online (Sandbox Code Playgroud)

你的模特

function get_data() {
     return config('app.product_data')->product_var;
}
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助.


Moz*_*mil 5

我最近回答了一个问题,作者有一个非常好的全局缓存表值的方法。

这个想法是他正在获取表值(也缓存它),他做了一个设置ServiceProvider,以便以后能够将它作为配置变量访问。

也许这对你也很有效。