• Час читання ~2 хв
  • 03.07.2022

Олівер Найбро зробив витяг запит до Laravel (8.59.0), що дозволяє розробникам вимагати встановлення морфографічних карт, замість того, щоб використовувати за замовчуванням повні імена класів.

Використовуючи метод enforceMorphMap замість традиційного методу morphMap, Laravel гарантує, що всі морфи зіставляються з псевдонімом, і видає ClassMorphViolationException > виняток, якщо він не відображено.

// If any other models are morphed but not mapped, Laravel
// will throw a `ClassMorphViolationException` exception.
Relation::enforceMorphMap([
    'user' => User::class,
]);

Ви можете застосувати морфологічну карту за допомогою єдиного виклику, показаного вище, або ви можете використовувати окремий метод requireMorphMap у класі Relation:

// Turn morph map enforcement on (new in 8.59.0).
Relation::requireMorphMap();
 
// And then map your morphs in the standard way.
Relation::morphMap([
    'user' => User::class,
]);

Тон зміни карти

Під час створення поліморфних зв’язків у Laravel поведінкою за замовчуванням завжди було збереження імені класу пов’язаної моделі в базі даних. З Документація Laravel:

За замовчуванням Laravel використовуватиме повне ім’я класу для збереження «типу» пов’язаної моделі.Наприклад, враховуючи наведений вище приклад взаємовідносин «один до багатьох», де модель коментарів може належати моделі публікації або відео, за умовчанням commentable_type буде або App\Models\Post code> або App\Models\Video відповідно.

Використання цього методу за замовчуванням означає, що ваша база даних буде в кінцевому підсумку заповнена іменами класів ваших моделей, що тісно пов’язує дані у вашій базі даних з іменами ваших класів.

Laravel завжди надавав нам можливість відокремити назву класу від бази даних за допомогою реєстрація MorphMap, яка надає псевдонім для класу, порушуючи цю асоціацію:

// Store `user` in the database, instead of `App\User`
Relation::morphMap([
    'user' => User::class,
]);

Хоча така поведінка була доступна протягом певного часу, ніколи не було можливості суворо вимагати її.

Переваги Morph Maps

Перевага наявності морфографічної карти в першу чергу полягає в тому, щоб відокремити логіку програми від збережених даних. Зберігання імен класів у вашій базі даних може призвести до шкідливих помилок, які важко налагодити.

Якщо ви зміните назву одного з класів, які були змінені, усі посилання у вашій базі даних більше не будуть співпадати з вашою програмою. Ця підступна частина цього полягає в тому, що цілком ймовірно, що ніщо не підведе під час розробки чи тестування! Якщо ваш набір тестів якимось чином не заповнить вашу базу даних іменем попереднього класу, усі ваші тести будуть зеленими.Лише під час розгортання в робочому стані виникне невідповідність класів і даних.

Сценарій, наведений вище, можна вирішити, написавши міграцію для оновлення збережених даних, але немає гарантії, що ви (або наступна особа, або наступний) пам’ятаєте, що це необхідно.

Замість того, щоб покладатися на інституційну пам’ять вашої компанії, морфографічні карти розривають зв’язок і звільняють вас від потенційної помилки.

Переваги застосування морфологічної карти

Так само, як морфографічні карти звільняють вас від необхідності оновлювати збережені дані під час рефакторингу класу, вимагання морфографічної карти позбавляє вас від необхідності пам’ятати, що вам потрібно зареєструвати клас на першому місці.

Relation::morphMap([
    'image' => Image::class,
    'post' => Post::class,
]);
  • image - from the morph map
  • post - from the morph map
  • App\Video - from the Laravel default implementation
// All future morphs *must* be mapped!
Relation::enforceMorphMap([
    'image' => Image::class,
    'post' => Post::class,
]);

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297