#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'),
Заменил его на соответствующую запятую, и все работает, как ожидалось.