Symfony чаще встречается в крупных компаниях и долгоживущих системах. Даже если вакансия про Laravel, полезно понимать устройство Symfony: Laravel построен на его компонентах.
Компоненты
HttpFoundation (Request, Response), HttpKernel, Routing, DependencyInjection, EventDispatcher, Console, Security, Form, Validator, Serializer, Messenger, Mailer, Cache, HttpClient. Их используют отдельно: Laravel, Drupal, Composer.
Путь запроса
public/index.phpсоздаётKernelиRequest.HttpKernelгенерирует события:kernel.request: маршрутизация и безопасность, можно сразу вернуть ответ;kernel.controller: выбран контроллер, резолверы готовят аргументы;kernel.view: если контроллер вернул неResponse;kernel.response: изменить ответ (заголовки);kernel.terminate: после отправки ответа;kernel.exception: при ошибке.
#[Route('/orders/{id}', methods: ['GET'])]
public function show(Order $order): JsonResponse
{
$this->denyAccessUnlessGranted('ORDER_VIEW', $order);
return $this->json($order, context: ['groups' => 'order:read']);
}
Контейнер зависимостей
Все классы из src/ регистрируются автоматически: autowire подставляет зависимости по типам, autoconfigure добавляет теги по интерфейсам. Контейнер компилируется в PHP-код один раз (cache:warmup), поэтому в рантайме нет разбора конфигурации и рефлексии. Циклические зависимости обнаруживаются при компиляции.
Doctrine
Data Mapper: сущности это обычные классы с атрибутами, сохранением занимается EntityManager.
$order = new Order($customer);
$em->persist($order); // поставить под управление
$em->flush(); // Unit of Work вычислит изменения и выполнит SQL в транзакции
- Identity Map: одна сущность на строку в рамках
EntityManager. - Ленивые связи через прокси, против N+1
JOINс выборкой связи в DQL. - Миграции:
doctrine:migrations:diffиmigrate. - В воркерах периодически
$em->clear(), иначе память растёт.
Messenger
Шина сообщений: команда отправляется в MessageBusInterface, обработчик помечен #[AsMessageHandler], маршрутизация решает, выполнить сразу или в транспорт (Doctrine, Redis, AMQP). Воркер messenger:consume, повторы по стратегии, failure transport для упавших.
Безопасность
- Firewall: как аутентифицировать (форма, токен) в разных частях приложения.
- Роли и
access_control: кто куда может. - Voters: можно ли этому пользователю сделать это с этим объектом.
- Секреты: переменные окружения и
secrets:set.
Laravel и Symfony
| Laravel | Symfony |
|---|---|
| Eloquent (Active Record) | Doctrine (Data Mapper) |
| Сервис-провайдеры | services.yaml, бандлы, атрибуты |
| Очереди | Messenger |
| Blade | Twig |
| Policies | Voters |
Что спросят на собесе
- Какие события генерирует HttpKernel и в каком порядке?
- Как работает autowiring и почему контейнер компилируется?
- Чем
persistотличается отflush? - Как проверить права на конкретный объект?
- Чем Symfony отличается от Laravel?