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

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

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

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

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

По этой причине я создам 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">
         $globalAlert 
    </div>
@endif