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

时间:2017-05-22 07:38:18

标签: 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**

自定义助手

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

    }
}

我的控制器

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

我的模特

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

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

4 个答案:

答案 0 :(得分:10)

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

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

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

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

这样我们可以确定product_var的来源。稍后您可以在代码中的任何位置使用辅助函数app('product_var')

  

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

答案 1 :(得分:8)

像@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 :(得分:4)

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

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

也许这对你来说也很合适。

答案 3 :(得分: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');
    }
}