Подтвердить что ты не робот

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 в библиотеках или просто помещаем эту переменную в основные контроллеры. Где я должен установить глобальную переменную?

4b9b3361

Ответ 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');
    }
}