Перейти до основного вмісту

Повернутися до 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. Без налаштованого перетворення читання повертає точне декодоване значення. Перетворення даних дають змогу повертати об’єкти застосунку.

Див. також​