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;
}
Как вы можете видеть мои сценарии выше, $this->product_var
почти используется для custom helper
, my controller
и my model
.
в codeigniter мы создаем папку Globals.php в библиотеках или просто помещаем эту переменную в основные контроллеры.
Где я должен установить глобальную переменную?
Ответы
Ответ 1
Как @Mozammil упомянул:
Идея заключается в использовании "конфигураций Laravel". Это позволяет сохранять значения в глобальной области действия для одного цикла запросов.
Вы можете получить доступ к этому значению через приложение, используя помощник config()
Laravel.
Вам нужно просто установить его как:
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
Конфигурация не является хорошим способом для хранения глобальной переменной. Поскольку структура предполагает, что config должен содержать только конфигурацию для вашего проекта. И они должны быть независимы от запроса.
Laravel обеспечивает гораздо лучший способ обработки глобальных переменных, вы можете использовать Singletons. Зачем?
Поскольку одноэлементность удерживает приложение на самом глубоком уровне, его можно вызвать и получить в части запроса. После объявления довольно сложно изменить синглтон в середине запроса.
Вы можете поместить этот код в свой AppServiceProvider или создать собственный ProductVarServiceProvider.
App::singleton('product_var', function(){
return DB::table('categories')->where('id', '2')->first();
});
Таким образом вы можете быть уверены в происхождении product_var
. Позже вы можете использовать вспомогательную функцию app('product_var')
в любом месте вашего кода.
Вы должны быть осторожны при объявлении глобальных переменных.
Ответ 3
Недавно я ответил на question, благодаря чему у автора был очень хороший способ глобально кэшировать значения таблиц.
Идея состоит в том, что он извлекал значения таблиц (также кэшировал их), и он сделал настройки ServiceProvider
, чтобы иметь возможность получить к нему доступ в качестве переменной конфигурации позже.
Возможно, это тоже сработает для вас.
Ответ 4
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');
}
}