docs(articles): From Magento to Symfony, a requalification guide grouped into sections
uk/articles/magento-to-symfony/practice/plan.md
новий файл +60
−0
1
+
# План на три тижні
2
+
3
+
Найшвидший шлях — переписати знайомий Magento-модуль на Symfony. Наскрізна вправа нижче: FAQ з категоріями, JSON API для читання й редагування, імпортом і нічним прибиранням. Кожна частина модуля має свою пару в Symfony.
4
+
5
+
| Частина Vendor_Faq | Що написати в Symfony |
6
+
|---|---|
7
+
| db_schema.xml: faq_question, faq_category | Entity\Question, Entity\Category, міграція |
8
+
| Model, ResourceModel, Collection, Api/* | QuestionRepository з 3–4 методами |
9
+
| webapi.xml + Api/*Interface | FaqController: `GET /api/faq`, `GET /api/faq/{slug}` + групи серіалізації |
10
+
| adminhtml: збереження й видалення | `POST`, `PUT`, `DELETE` з DTO через `#[MapRequestPayload]` і Validator |
11
+
| acl.xml | Firewall, ролі, Voter |
12
+
| Імпорт CSV через чергу | Команда app:faq:import + Messenger |
13
+
| crontab.xml: прибирання | #[AsCronTask] |
14
+
| system.xml: faq/general/enabled | %env(bool:FAQ_ENABLED)% |
15
+
| Integration tests | WebTestCase + KernelTestCase + Foundry |
16
+
17
+
## Тиждень 1. Фундамент: запит, DI, контролери
18
+
19
+
- Книга «Symfony: The Fast Track», розділи до Doctrine.
20
+
- Документація: Routing, Controller, Service Container.
21
+
- Схема [життя запиту](../basics/lifecycle.md) і всі `debug:*` команди.
22
+
23
+
**Вправа:** новий проєкт (`symfony new` або `symfony/skeleton`), ендпоінти `GET /api/faq` і `GET /api/faq/{slug}` на захардкоджених даних, декоратор і тегований пул сервісів.
24
+
25
+
## Тиждень 2. Дані, форми, доступ
26
+
27
+
- Doctrine: сутності, зв'язки, Unit of Work, QueryBuilder, міграції.
28
+
- Validator, DTO на вході, Security.
29
+
- Профайлер: знайти й виправити N+1.
30
+
31
+
**Вправа:** сутності, міграції, фікстури, ендпоінти запису з DTO і валідацією, доменні винятки, які слухач `kernel.exception` перетворює на HTTP-відповіді з потрібним статусом.
32
+
33
+
## Тиждень 3. Асинхронність, API, тести, prod
34
+
35
+
- Messenger, Scheduler, Cache, Serializer.
36
+
- KernelTestCase, WebTestCase, Foundry.
37
+
- Деплой: prod-середовище, воркери.
38
+
39
+
**Вправа:** імпорт CSV через чергу, нічне прибирання, кеш з тегами, функціональні тести API, збірка в prod.
40
+
41
+
## Чекліст
42
+
43
+
Шістнадцять речей, які варто зробити руками, а не лише прочитати.
44
+
45
+
- [ ] Створив проєкт (`symfony new` або `composer create-project symfony/skeleton`) і запустив його локально.
46
+
- [ ] Можу пояснити, що відбувається між `index.php` і контролером: події `kernel.*`.
47
+
- [ ] Знаходжу сервіси через `debug:autowiring` і `debug:container`.
48
+
- [ ] Замінив реалізацію інтерфейсу через alias або `#[AsAlias]`.
49
+
- [ ] Написав декоратор там, де в Magento був би плагін.
50
+
- [ ] Зібрав набір реалізацій через тег і `#[AutowireIterator]`.
51
+
- [ ] Створив сутність зі зв'язком ManyToOne і згенерував міграцію.
52
+
- [ ] Можу пояснити, чому `flush()` записує всі зміни, а не одну сутність.
53
+
- [ ] Знайшов N+1 у профайлері й прибрав його fetch join.
54
+
- [ ] Додав ендпоінт з DTO на вході через `#[MapRequestPayload]` і перевірив відповідь 422 на невалідних даних.
55
+
- [ ] Закрив `/admin` роллю і написав Voter.
56
+
- [ ] Перетворив доменний виняток на HTTP-відповідь слухачем `kernel.exception`.
57
+
- [ ] Виніс важку роботу в Messenger і запустив воркер.
58
+
- [ ] Налаштував періодичну задачу в Scheduler.
59
+
- [ ] Написав WebTestCase і KernelTestCase з даними з Foundry.
60
+
- [ ] Зібрав prod: `composer dump-env prod`, `cache:clear`, міграції, перезапуск воркерів.