План на три тижні

← План на три тижні

Ashterix

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`, міграції, перезапуск воркерів.