Найти в Дзене
Jh5.Studio

Laravel: Загрузка настроек конфигурации из базы данных (или файлов)

Настройки? Какие настройки? Допустим, в нашем веб-приложении для Подкастов нам нужно вытащить список настроек, если мы хотим показать глобальное предупреждение на сайте, например, чтобы предупредить о времени обслуживания, новом шоу и т. д. Итак, нам нужно добавить настройки с текстом предупреждения. Если текст пуст, то никакое предупреждение не будет показано. По этой причине я создам Eloquent модель под названием “Setting” с миграцией, а затем добавлю столбцы “name” и “value”, причем последние будут иметь значение nullable. php artisan make:model Setting --migration После добавления столбцов в файл миграции я добавлю нужные параметры. В этом случае глобальное оповещение пользователей. Я сделал создал её в одном из Seeder файле: Setting::create([ ‘name’ => ‘global_alert’, ‘value’ => null ]); Довольно просто, а теперь небольшое волшебство... Добавление настроек в глобальную конфигурацию Laravel включает в себя удобную функцию под названием config(), которая предназначена для настройки

Настройки? Какие настройки?

Допустим, в нашем веб-приложении для Подкастов нам нужно вытащить список настроек, если мы хотим показать глобальное предупреждение на сайте, например, чтобы предупредить о времени обслуживания, новом шоу и т. д.

Итак, нам нужно добавить настройки с текстом предупреждения. Если текст пуст, то никакое предупреждение не будет показано.

По этой причине я создам Eloquent модель под названием “Setting” с миграцией, а затем добавлю столбцы “name” и “value”, причем последние будут иметь значение nullable.

php artisan make:model Setting --migration

После добавления столбцов в файл миграции я добавлю нужные параметры. В этом случае глобальное оповещение пользователей. Я сделал создал её в одном из Seeder файле:

Setting::create([ ‘name’ => ‘global_alert’, ‘value’ => null ]);

Довольно просто, а теперь небольшое волшебство...

Добавление настроек в глобальную конфигурацию

Laravel включает в себя удобную функцию под названием config(), которая предназначена для настройки каждой службы загрузки вашего приложения, например, кэша, базы данных и т. д.

Основное преимущество этой функции заключается в том, что она работает как геттер, если вы вводите только строку с точечной нотацией или абсолютно ничего, и как сеттер, если вы вводите массив.

Итак, давайте откроем AppServiceProvider и скажем Laravel, что когда приложение загрузится, то есть после того как загрузится, когда все остальные сервисы будут готовы, мы добавим в конфигурационный массив собственные настройки.

/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
config([
'global' => Setting:all([
'name','value'
])
->keyBy('name') // key every setting by its name
->transform(function ($setting) {
return $setting->value // return only the value
})
->toArray() // make it an array
])
// ...
}

Затем конфигурация будет добавлена в список, вы можете это проверить с помощью dd(config()) вызвав эту команду после метода загрузки или где угодно в вашем приложении.

Вот в основном и все. При этом, вы могли бы:

  • Использовать DB напрямую, чтобы избежать накладных расходов Eloquent модели (если Вы не храните массивы или json, которые вам придется конвертировать вручную).
  • Добавить столбец с именем “группа”, который позволит вам сгруппировать поднастройки с их помощью, а затем использовать groupBy после извлечения всех элементов. Или использовать точечную нотацию.
  • Использовать SQLite только с помощью свойства "connection" модели Eloquent или метода” connection" при непосредственном использовании DB::class.
  • Сделать свой собственный ServiceProvider для загрузки конфигураций, чтобы бы не засорять кодом основной провайдер.
  • Добавить логический столбец, сообщающий, является ли он глобальным, и запросите только те записи которые имеют значение true.

Бонус: Добавление предупреждения

В нашем HomeController я проверю, существует ли оповещение и пусто ли оно, прежде чем передать его в представление.

/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$globalAlert = config('settings.global_alert');
return view('home', [
'globalAlert' => $globalAlert
]);
}

Затем в любом месте шаблона в <body> я добавлю условие if. PHP считает значение null ложным, поэтому, если на значении есть даже маленькая точка, оно будет считаться истинным.

@if($globalAlert)
<div class="alert alert-info small">

</div>
@endif

Хотите больше новостей про Laravel? Заходите на наш сайт: https://jh5.ru/news