Статті про Symfony українською
Dependency injection, Doctrine, Messenger і межі шарів. Матеріали для тих, хто веде великі Symfony-застосунки.
НАЙНОВІША
SYMFONY
30 вересня 2026
AssetMapper: фронтенд у Symfony без Node і збирання
Import map замість бандла: браузер сам розв'язує `import 'chart.js'`, а Symfony лише роздає файли з дайджестом у назві. Розбираємо, що саме рендерить `importmap()`, як пакети з jsDelivr опиняються в `assets/vendor/`, як сюди вписуються CSS і Tailwind без Node, який вигляд має деплой після `asset-map:compile` і в яких випадках Encore чи Vite все одно лишаються правильною відповіддю.
РP
Редакція phpukraine
·
7 хв читання
6
статей
SYMFONY
30 вересня 2026
AssetMapper: фронтенд у Symfony без Node і збирання
Import map замість бандла: браузер сам розв'язує `import 'chart.js'`, а Symfony лише роздає файли з дайджестом у назві. Розбираємо, що саме рендерить `importmap()`, як пакети з jsDelivr опиняються в `assets/vendor/`, як сюди вписуються CSS і Tailwind без Node, який вигляд має деплой після `asset-map:compile` і в яких випадках Encore чи Vite все одно лишаються правильною відповіддю.
РP
Редакція phpukraine
·
7 хв
·AssetMapper
·Фронтенд
SYMFONY
27 вересня 2026
Symfony Scheduler замість cron: періодичні задачі як повідомлення
Crontab живе поза репозиторієм, не читається в code review і ніяк не тестується. Symfony Scheduler переносить розклад у код: `RecurringMessage`, воркер `messenger:consume scheduler_default`, lock проти дублювання на кількох машинах, stateful-режим для пропущених запусків і звичайні юніт-тести, які перевіряють дати наступних запусків.
РP
Редакція phpukraine
·
8 хв
·Scheduler
·Messenger
·Cron
SYMFONY
15 вересня 2026
Форми Symfony чи DTO з валідатором: як не потонути у FormType
`#[MapRequestPayload]` перетворює тіло запиту на типізований об'єкт і валідує його без жодного FormType, і для JSON-ендпоінтів це майже завжди правильний вибір. Але щойно з'являються вкладені колекції з кнопкою «додати рядок», залежні селекти й рендеринг помилок у Twig, форми повертають собі перевагу. Розбираємо, що саме робить резолвер під капотом, де він мовчки віддає 404 замість 422, як віддати формі й API один і той самий набір constraints і чому тест на DTO пишеться за три рядки, а на FormType - за тридцять.
РP
Редакція phpukraine
·
7 хв
·Forms
·DTO
·Validator
SYMFONY
14 вересня 2026
Авторизація в Symfony: voters, атрибути IsGranted і межа з бізнес-правилами
Роль відповідає на питання «хто ти», voter - на питання «чи можна тобі зробити це саме з цим об'єктом». Розбираємо voter на прикладі редагування чужої вакансії, `CacheableVoterInterface` і чому без нього воутер викликається завжди, `#[IsGranted]` із subject та Expression, статус 404 замість 403, і де проходить межа, за якою перевірка перестає бути авторизацією і стає бізнес-правилом.
РP
Редакція phpukraine
·
8 хв
·Security
·Voters
·Авторизація
SYMFONY
4 вересня 2026
Теговані сервіси й compiler passes: розширення без правки чужого коду
Точка розширення в Symfony — це не інтерфейс і не абстрактний клас, а тег у контейнері. Розбираємо, як тег перетворюється на `iterable` чи `ServiceLocator` у конструкторі, коли атрибутів уже не вистачає і треба писати compiler pass, у якому порядку проходи виконуються, чому ваш сервіс зникає до того, як пас до нього дійде, і як усе це дебажити через `debug:container`.
РP
Редакція phpukraine
·
9 хв
·DI-контейнер
·Compiler passes
SYMFONY
3 вересня 2026
Messenger і outbox: як не втратити подію між транзакцією і брокером
Класична дірка: сутність збережена, а повідомлення в брокер не пішло — або пішло, а транзакція відкотилась. Symfony Messenger вміє закривати її без окремої бібліотеки: Doctrine transport пише повідомлення тим самим з'єднанням, що й ваші сутності, тож INSERT потрапляє в ту саму транзакцію. Розбираємо конфіг, ретраї, failed transport, дедуплікацію на боці споживача і випадки, коли весь цей апарат вам не потрібен.
РP
Редакція phpukraine
·
9 хв
·Messenger
·Outbox
·Doctrine