Пастки

← Пастки

Ashterix

docs(articles): From Magento to Symfony, a requalification guide grouped into sections

uk/articles/magento-to-symfony/quality/traps.md новий файл +81 −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-сервіс на кожну сутність — це церемонія без користі в застосунку, яким ви володієте. Додавайте шар, коли з'являється реальна причина.