Перейти к основному содержимому

Вернуться к README · Начало работы →

Laravel Model Settings

Laravel Model Settings хранит общие настройки по умолчанию и переопределения для отдельных моделей в отдельной таблице базы данных. Пакет подходит для случаев, когда все модели должны начинать с одного значения, но отдельные записи могут его переопределять.

Пакет не добавляет столбцы настроек в родительские таблицы. Настройки не зависят от схемы модели и группируются по morph-классу Eloquent-модели.

Когда пакет подходит​

ТребованиеПоведение пакета
Задать одинаковое начальное значение всем сохранённым моделямСохранить одно значение по умолчанию для класса
Изменить значение одной моделиСохранить переопределение для этой модели
Удалить переопределениеСнова использовать значение по умолчанию для класса
Прочитать настройки многих моделейЗаранее загрузить одну связь со значениями по умолчанию и переопределениями

Порядок выбора значения​

При чтении настройки пакет возвращает первое доступное значение:

  1. Переопределение для сохранённой модели.
  2. Значение по умолчанию для класса этой модели.
  3. null.
Источникtimezone
Значение по умолчанию для UserUTC
Переопределение для пользователя 123Europe/Paris
Итоговое значение для пользователя 123Europe/Paris
Итоговое значение для другого сохранённого пользователяUTC

Удаление переопределения снова открывает доступ к значению по умолчанию. Само значение по умолчанию не удаляется.

Основные операции​

(new User)->defaultSettings()->set('timezone', 'UTC');

$user->settings()->set('timezone', 'Europe/Paris');

$timezone = $user->settings()->get('timezone');
$settings = $user->settings()->all();
$hasTimezone = $user->settings()->has('timezone');

$user->settings()->setMany([
'locale' => 'fr',
'notifications.email' => true,
]);
$user->settings()->forgetMany(['timezone', 'locale']);

get() возвращает одно итоговое значение. all() возвращает Illuminate\Support\Collection, в которой значения по умолчанию объединены с переопределениями. Используйте has(), когда нужно проверить наличие итогового ключа, в том числе при сохранённом JSON null. get() намеренно не принимает резервное значение от вызывающего кода: единственным резервным значением остаётся сохранённое значение класса по умолчанию, а при отсутствии ключа в обеих областях возвращается null.

Для значений по умолчанию и переопределений доступны одинаковые операции: all(), get(), has(), set(), setMany(), forget(), forgetMany() и purge().

Границы специализированного пакета​

Laravel Model Settings — специализированный пакет для Eloquent, а не универсальный фреймворк настроек приложения.

ГраницаНамеренное поведение
ХранениеОдна таблица базы данных; без Redis и хранения в полях родительской модели
Значения по умолчаниюСлужебные строки в той же таблице; без второй таблицы значений по умолчанию
РегистрацияБез реестра репозиториев, типизированных глобальных классов настроек и обнаружения классов
МиграцииБез средства запуска миграций для отдельных ключей настроек
КэшированиеБез обязательного межзапросного кэша; предварительная загрузка переиспользует только загруженную связь

Приложениям с такими требованиями следует реализовать их вне пакета, а не использовать modelSettings или внутренний репозиторий как API расширения.

Границы хранения​

Каждая строка определяется четырьмя значениями:

ЗначениеСмысл
item_typeMorph-класс родительской модели или псевдоним из morph map
item_idПервичный ключ родителя; для настроек класса по умолчанию сохраняется физическое значение 0
is_defaulttrue для настройки класса по умолчанию, false для переопределения модели
keyИмя настройки

Благодаря этому значения по умолчанию независимы для каждого класса модели. Значение по умолчанию для User никогда не становится значением по умолчанию для Post, даже если оба класса используют один ключ настройки.

Поддерживаемые модели​

Пакет поддерживает Eloquent-модели с целочисленными, строковыми, UUID- и ULID-первичными ключами. Сохранённые модели с целочисленным идентификатором 0 или строковым '0' могут хранить переопределения без конфликта со значениями класса по умолчанию. Также можно использовать Laravel morph map.

Настройки отдельных моделей относятся только к сохранённым моделям. Несохранённая модель не наследует значения по умолчанию: get() возвращает null, has() — false, а all() — пустую коллекцию. Вызов set(), setMany(), forget(), forgetMany() или purge() для несохранённого владельца выбрасывает InvalidSettingsOwnerException до выполнения запроса к хранилищу.

Данные настроек хранятся в JSON, включая null, пустые строки, строки из пробелов, пустые массивы, ноль и false. Без настроенного преобразования чтение возвращает точное декодированное значение. Преобразования данных позволяют возвращать объекты приложения.

См. также​