Laravel 5.7: корень фасада не был установлен

#php #laravel

#php #laravel

Вопрос:

Я пытаюсь получить глобальные настройки сайта из базы данных и использовать эти настройки в своих контроллерах.

Для того, чтобы сделать это, я создал пользовательскийglobal.php файл в каталоге config.
Определенные пары ключ => значение.
Пытался получить значения, используя DB::table(….) фасад.

Но он возвращает эту ошибку:

Корень фасада не был установлен.

Я не могу пройти дальше этого.

config.php файл следующим образом:

 use IlluminateSupportFacadesDB;

return [ 

    'image_resize' => DB::table('settings')->where('id', 1)->value('image_resize'),
    'popup' => DB::table('settings')->where('id', 1)->value('popup'),
    'site_on' => DB::table('settings')->where('id', 1)->value('site_on')

];
  

Комментарии:

1. Почему бы не использовать файл .env?

2. вы включили фасады в app.php файле?

3. @Adam: потому что я хочу переписать эти настройки с помощью моей панели управления.

4. @kuh-chan: Да, я использую фасад DB в нескольких других контроллерах проекта.

5. Эта ошибка возникает из-за того, что в laravel сначала регистрируются конфигурации, а затем фасады

Ответ №1:

Вы можете использовать это

 use IlluminateSupportFacadesConfig;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Config::set('global', [
            'image_resize' => DB::table('settings')->where('id', 1)->value('image_resize'),
            'popup' => DB::table('settings')->where('id', 1)->value('popup'),
            'site_on' => DB::table('settings')->where('id', 1)->value('site_on')
        ]);
    }
  

Затем в контроллере вы можете использовать config('global.site_on')

Также вы можете использовать один запрос, а не три

 public function register()
{
    $setting = DB::table('settings')
        ->where('id', 1)
        ->first(['popup', 'image_resize', 'site_on']);
    Config::set('global', [
        'image_resize' => $setting->image_resize,
        'popup' => $setting->popup,
        'site_on' => $setting->site_on
    ]);
}
  

Или, короче, код

 public function register()
{
    $setting = DB::table('settings')
        ->where('id', 1)
        ->first(['popup', 'image_resize', 'site_on']);
    Config::set('global', get_object_vars($setting));
}
  

Комментарии:

1. Спасибо Davit, я пробовал, но выдает эту ошибку: «Класс ‘App Providers Config’ не найден»

2. Добавить use IlluminateSupportFacadesConfig; см. обновленный ответ

3. @megavolkan ты это пробовал??

4. Да, у меня есть, и это работает блестяще. За исключением короткого кода, не работает. Выдает ошибку, в которой говорится, что «Постоянная «настройка «не определена в методе get_bject_vars (setting)». Я использовал длинную версию, и она работает. Спасибо @Davit.

5. Попробуйте, this Config::set('global', get_object_vars($setting)); должно быть $setting , я забыл $

Ответ №2:

Я столкнулся с этой проблемой после того, как я возился со своим app/config.php файл. Я добавил некоторые параметры и случайно поставил точку с запятой вместо запятой после этого. У меня был:

 'vapid_public_key'   => env('VAPID_PUBLIC_KEY'); <--- offending semi-colon
'vapid_private_key'  => env('VAPID_PRIVATE_KEY'),
  

Заменил его на соответствующую запятую, и все работает, как ожидалось.