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

21

我以前在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;
}

根据我上面的脚本,你可以看到$this->product_var 几乎被用于自定义辅助函数我的控制器我的模型。 在CodeIgniter中,我们可以在libraries文件夹中创建Globals.php,或者将变量放置在核心控制器中。 那么,我应该在哪里设置全局变量呢?


将其设置在会话中。 - Tpojka
@Tpojka 我有很多变量。将所有变量添加到会话中是最佳实践吗? - Willyanto Halim
4个回答

12

就像 @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;
}
希望这会有所帮助。

11

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

Laravel提供了更好的处理全局变量的方式,你可以使用单例模式。为什么呢? 因为单例模式在应用程序的最深层级上持有,可以在请求的任何部分调用和使用。一旦声明,就很难在请求过程中更改单例。

您可以将此代码放入您的AppServiceProvider中,或者您可以创建自己的ProductVarServiceProvider。

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

这样可以确保您了解product_var的来源。 之后,您可以在代码的任何地方使用辅助函数app('product_var')

声明全局变量时应格外小心。


1
很好,因为单例在这里是获取应用程序中任何地方统一值的完美方式。但我有疑问,它会触发一次查询还是每次调用时都会触发? - Pratik Soni
1
不,一旦单例解决了,Laravel 将保持其值。 - anwerj

5

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

他的想法是获取表值(同时进行缓存),并制作一个设置ServiceProvider以便稍后将其作为配置变量访问。

也许这对你来说也会非常有效。


2
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");
            }
        }

使用方式如下

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接