我曾经在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 helper
,my controller
和my model
。
在codeigniter中,我们在libraries文件夹中创建Globals.php,或者只是将变量放在核心控制器中。
我应该在哪里设置全局变量?
答案 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');
}
}