Настройки
Настройки в 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),
];
}
}
Мета-свойства
| Свойство | Тип | Описание |
|---|---|---|
$group | string | Уникальный ключ группы, используется для кэширования и URL |
$label | string | Название группы, отображается в UI |
$icon | ?string | Иконка из Tabler Icons (опционально) |
$description | ?string | Описание группы, отображается под заголовком (опционально) |
$order | int | Порядок сортировки на странице настроек |
Типизированные свойства
Публичные нестатические свойства класса определяют схему настроек. Значения по умолчанию задаются прямо в свойствах:
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. Это предотвращает случайное обнуление значений.