Глобальные настройки для приложения Laravel

В приложениях часто бывает полезно хранить некоторые глобальные настройки. Эти настройки не связаны с конкретной моделью, например с пользователем, а с системой в целом. Конечно, вы можете добиться этого с помощью Eloquent, но я всегда чувствовал, что это не правильный подход, поскольку вы сохраняете нереляционные данные в реляционной системе. Я обнаружил, что пакет Spatie’s Valuestore package идеально подходит для создания репозитория настроек для приложения.

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

Для начала установим пакет:

$ composer require spatie/valuestore

Теперь вы можете создать Valuestore, указав путь на диске, который вы хотите, чтобы настройки были прочитаны и записаны. Я хочу, чтобы мой файл настроек находился в файле storage/app/settings.json, поэтому в моем контроллере я создам объект Valuestore с помощью метода static::make($path) и добавлю в него некоторые значения.

public function update(Request $request)
{
$settings = Valuestore::make(storage_path('app/settings.json'));

$settings->put('banner_notification', $request->banner_notification);

return redirect()->back()->with(['notice' => 'Settings updated']);
}

Как вы можете видеть в этом фрагменте, мы добавляем запрос banner_notification в Valuestore. Под капотом пакет Valustore - это JSON, кодирующий значения и сохраняющий их в файловой системе в наших settings.json. Пакет будет управлять этим файлом для нас, поэтому, если он не существует, он его создаст, и если мы удалим все значения, он удалит файл.

API использует многие из тех же методов, что и cache repository в Laravel, поэтому вы не должны испытывать проблем при работы с ним.

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

// В контроллере... 

public function __invoke()
{
$settings = Valuestore::make(storage_path('app/settings.json'));

return view('homepage', ['settings' => $settings]);
}

// и во view...

@if($settings->has('banner_notification'))
<div class="banner-notification">
{{ $settings->get('banner_notification') }}</div>
@endif

Valuestore - действительно хороший способ сохранить некоторые свободные значения, которые не нужно сохранять в базе данных. Никаких миграций, нет моделей, просто файл JSON, содержащий ваши настройки. Идеальная подходит для хранения настроек в виде пар ключ/значение. Просто убедитесь, что вы установили свой файл настроек в недоступное из вне место.

В пакете также есть множество других действительно удобных методов работы с вашими сохраненными данными, которые вы должны проверить.

Хотя это все, что вам нужно для начала работы, я также нашел следующие советы, полезные при работе с Valuestore.

Связывание с контейнером

В предыдущем примере вы можете видеть, что нам приходилось несколько раз создавать Valuestore, и мы переписываем логику создания экземпляра в нескольких местах, поэтому мы изменим подход и будем создавать экземпляр класса через контейнер Laravel. Это также даст нам возможность использовать Valuestore в наших контроллерах.

Сначала мы создадим собственный класс настроек, который расширяет Valuestore.


namespace App;

use Spatie\Valuestore\Valuestore;

class Settings extends Valuestore
{
    //
}

Затем мы привяжем экземпляр нашего нового класса к контейнеру в с помощью метода singleton в AppServiceProvider.

// AppServiceProvider...

public function register()
{
    $this->app->singleton(Settings::class, function () {
    return Settings::make(storage_path('app/settings.json'));
});
}

Теперь мы можем инжектить наши настройки в контроллерах:

public function update(Request $request, Settings $settings)
{
    $settings->put('banner_notification', $request->banner_notification);

    return redirect()->back()->with(['notice' => 'Settings updated']);
}

Global helper

Я считаю, что добавление глобального helper метода settings() также очень полезно, когда вы хотите получить доступ к настройкам в своих view. Хотя вы можете достичь этого с помощью view composers или, передав из контроллера, как было показано ранее, я считаю, что глобальный помощник - это более простой подход.

// helpers.php

function settings($key = null, $default = null) {
    if ($key === null) {
        return app(App\Settings::class);
    }

    return app(App\Settings::class)->get($key, $default);
}

В ваших view теперь вы можете получать настройки с помощью глобального помощника. Это особенно удобно, когда на каждой странице требуется настройка, например, уведомление.

// The view...
<div class="banner-notification">
{!! settings()->get('banner_notification') !!}
{{-- or --}}
{!! settings('banner_notification') !!}
</div>

Мне очень нравится простота, которую предлагает этот пакет, чтобы вы могли хранить некоторые настройки. Я всегда чувствовал, что хранить данные такого типа в базе данных с помощью какой-либо настройки пары ключ/значение никогда не было правильным подходом. Если вам нужны какие-то глобально доступные настройки приложения, я определенно рекомендую проверить пакет Valuestore от Spatie. Спасибо, Spatie!

Перевод статьи Global Application Settings

Опубликовано:

Категории: Статьи Пакеты