Урок по треку PHP 6 мин

Symfony кратко

Компоненты, HttpKernel и события, DI, Doctrine, Messenger, voters.

Symfony чаще встречается в крупных компаниях и долгоживущих системах. Даже если вакансия про Laravel, полезно понимать устройство Symfony: Laravel построен на его компонентах.

Компоненты

HttpFoundation (Request, Response), HttpKernel, Routing, DependencyInjection, EventDispatcher, Console, Security, Form, Validator, Serializer, Messenger, Mailer, Cache, HttpClient. Их используют отдельно: Laravel, Drupal, Composer.

Путь запроса

  1. public/index.php создаёт Kernel и Request.
  2. 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

LaravelSymfony
Eloquent (Active Record)Doctrine (Data Mapper)
Сервис-провайдерыservices.yaml, бандлы, атрибуты
ОчередиMessenger
BladeTwig
PoliciesVoters

Что спросят на собесе

  • Какие события генерирует HttpKernel и в каком порядке?
  • Как работает autowiring и почему контейнер компилируется?
  • Чем persist отличается от flush?
  • Как проверить права на конкретный объект?
  • Чем Symfony отличается от Laravel?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.