Поддержка
Функции

Настройки

DTO-классы для типизированных настроек приложения с автоматическим UI

Настройки в Frame реализованы через DTO-классы. Каждый класс представляет группу настроек и одновременно является типизированным объектом для доступа в коде и описанием UI-формы для страницы настроек.

Создание

Используйте artisan-команду для генерации нового класса настроек:

php artisan frame:settings GeneralSettings

Файл будет создан в app/Frame/Settings/GeneralSettings.php.

Структура класса

<?php

declare(strict_types=1);

namespace App\Frame\Settings;

use Frame\Laravel\Fields\Number;
use Frame\Laravel\Fields\Text;
use Frame\Laravel\Fields\Toggle;
use Frame\Laravel\Settings\Settings;

class GeneralSettings extends Settings
{
    protected static string $group = 'general';

    protected static string $label = 'Общее';

    protected static ?string $icon = 'tabler-settings';

    protected static ?string $description = 'Основные параметры приложения';

    protected static int $order = 0;

    public string $application_name = 'Frame';

    public bool $maintenance_mode = false;

    public int $items_per_page = 15;

    public static function fields(): array
    {
        return [
            Text::make('application_name')
                ->label('Название приложения')
                ->required(),

            Toggle::make('maintenance_mode')
                ->label('Режим обслуживания')
                ->grid(md: 6),

            Number::make('items_per_page')
                ->label('Элементов на странице')
                ->default(15)
                ->grid(md: 6),
        ];
    }
}

Мета-свойства

СвойствоТипОписание
$groupstringУникальный ключ группы, используется для кэширования и URL
$labelstringНазвание группы, отображается в UI
$icon?stringИконка из Tabler Icons (опционально)
$description?stringОписание группы, отображается под заголовком (опционально)
$orderintПорядок сортировки на странице настроек

Типизированные свойства

Публичные нестатические свойства класса определяют схему настроек. Значения по умолчанию задаются прямо в свойствах:

public string $application_name = 'Frame';
public bool $maintenance_mode = false;
public int $items_per_page = 15;

Поддерживаемые типы: string, bool, int, float, array.

Метод fields()

Возвращает массив полей, которые определяют UI-форму для редактирования настроек. Имя поля должно совпадать с именем свойства класса.

Поля поддерживают грид-раскладку через метод ->grid():

Toggle::make('email_enabled')
    ->label('Email-уведомления')
    ->grid(md: 6), // половина ширины на md+

Регистрация

Зарегистрируйте классы настроек в методе settingsGroups() вашего FrameServiceProvider:

public function settingsGroups(): array
{
    return [
        GeneralSettings::class,
        NotificationsSettings::class,
        DisplaySettings::class,
    ];
}

Использование в коде

Доступ к настройкам — через контейнер или статический метод resolve():

// Через контейнер
$settings = app(GeneralSettings::class);
$settings->application_name; // string
$settings->maintenance_mode; // bool

// Статический доступ
GeneralSettings::resolve()->items_per_page; // int

Все свойства типизированы — IDE подскажет доступные поля и их типы.

Хранение и кэширование

Настройки хранятся в таблице frame_settings. Каждое свойство — отдельная строка с ключом, равным имени свойства.

Кэширование выполняется по группам через Cache::tags('frame'). При сохранении настроек через UI кэш соответствующей группы автоматически инвалидируется.

Для ручной инвалидации:

app(SettingsManager::class)->refresh('general'); // одна группа
app(SettingsManager::class)->refresh();          // все группы

CastableField

Если поле реализует интерфейс CastableField (например, Toggle, Color, Tags), при чтении из базы автоматически вызывается fromJson(), а при сохранении — toJson(). Это позволяет хранить сложные типы данных в текстовом поле.

IgnoreWhenEmpty

Поля, реализующие интерфейс IgnoreWhenEmpty (например, Password), не обновляются в базе если значение null. Это предотвращает случайное обнуление значений.