docs(articles): SEO titles, intros and a section preview image for From Magento to Symfony
uk/articles/magento-to-symfony/quality/traps.md
+4
−0
Пастки
Де Magento-досвід найчастіше підводить. Червоні блоки — пастки, що псують дані, жовті коштують часу.
flush() пише все
Не лише «цю» сутність, а кожну змінену в UnitOfWork. flush($entity) в ORM 3 прибрано. Тримайте flush у точці входу і не змінюйте сутності, які не збираєтесь зберігати.
Стан у властивостях сервісу
Сервіси спільні, а воркер Messenger живе годинами й обробляє тисячі повідомлень. Кеш, поточний користувач чи замовлення у властивості сервісу протікають між повідомленнями. Реалізуйте ResetInterface або не тримайте стан.
EntityManager is closed
Після винятку під час flush EntityManager закривається, і наступні операції падають. Не ловіть виняток, щоб продовжити тим самим EM. У воркерах Messenger про це дбає middleware Doctrine; у своїх циклах — ManagerRegistry::resetManager().
N+1 на лінивих зв'язках
Звичка «колекція, а потім getX() у циклі» тут генерує запит на кожну ітерацію. Дивіться лічильник запитів у профайлері і робіть fetch join.
Зміни всередині об'єкта не видно
Doctrine порівнює значення, а не вміст об'єктів. $this->date->modify('+1 day') на mutable DateTime не збережеться. Використовуйте DateTimeImmutable і присвоюйте нове значення; так само з масивами-об'єктами в JSON-колонках.
Inverse side не зберігається
У двосторонньому зв'язку в БД пишеться лише owning side. Додавайте хелпери, що оновлюють обидві сторони.
cache:clear не чистить дані
Системний кеш і пули — різні речі. Застарілі дані в Redis лишаються після cache:clear; для них cache:pool:clear або інвалідація тегами.
$container->get() не працює
Сервіси приватні, тож ObjectManager-підхід неможливий. Якщо сервіс треба вибрати в runtime, використайте #[AutowireLocator].
Невикористаний сервіс зникає
Контейнер видаляє приватні сервіси, які ніхто не інжектує. У тестах getContainer()->get() такого сервісу кидає помилку; це не баг конфігу.
Порядок слухачів має значення
Роутер на kernel.request має пріоритет 32, firewall — 8. Слухач з пріоритетом 20 виконається до автентифікації і не бачить користувача. Перевіряйте через debug:event-dispatcher.
Старий код у воркерах
Воркер тримає код у пам'яті. Після деплою — messenger:stop-workers, інакше повідомлення обробляє попередня версія.
Секрети в .env
.env комітиться, тому в ньому лише значення за замовчуванням для dev. Справжні ключі — у змінних середовища сервера або в secrets:set.
Перенесення Magento-шарів один в один
Api/Data-інтерфейс, Repository-обгортка над репозиторієм, Management-сервіс на кожну сутність — це церемонія без користі в застосунку, яким ви володієте. Додавайте шар, коли з'являється реальна причина.