Перейти к основному содержимому

Продвинутые концепции Symfony

Жизненный цикл событий ядра Symfony​

Symfony Request Lifecycle

Компонент HttpKernel отправляет несколько событий в течение жизненного цикла запрос-ответ:

  1. kernel.request: До выполнения любого контроллера.
  2. kernel.controller: После нахождения контроллера, но до его выполнения.
  3. kernel.controller_arguments: Перед вызовом контроллера (модификация аргументов).
  4. kernel.view: Если контроллер не вернул Response (преобразование в Response).
  5. kernel.response: После того как контроллер вернул Response (финальные модификации).
  6. kernel.finish_request: После отправки ответа.
  7. kernel.terminate: Для длительных задач после отправки ответа (например, отправка писем).
  8. kernel.exception: При возникновении исключения.

Возможности сервис-контейнера​

Autowiring и Autoconfigure​

  • Autowiring: Автоматически внедряет зависимости на основе type-hints.
  • Autoconfigure: Автоматически регистрирует сервисы по определённым тегам на основе их класса/интерфейса (например, автоматическое добавление тега console.command для команд).
  • Множественные экземпляры: Для внедрения двух разных экземпляров одного класса используйте Named Autowiring (через имена параметров, совпадающие с ID сервисов) или атрибут #[Target] в PHP 8.

CompilerPass​

CompilerPass позволяет манипулировать определениями сервисов до компиляции контейнера. Используется для сбора всех сервисов с определённым тегом и внедрения их в «реестровый» или «управляющий» сервис (например, добавление всех зарегистрированных типов транспорта в TransportFactory).

Symfony Flex​

Flex — это плагин Composer, который автоматизирует установку и настройку бандлов Symfony через «рецепты». Он управляет структурой директорий, конфигурационными файлами и переменными окружения.


Symfony Messenger​

Компонент Messenger предоставляет способ отправки и получения сообщений с использованием различных транспортов (Redis, RabbitMQ, Doctrine или Sync).

  • Sync vs Async: По умолчанию обработчики работают синхронно. Для асинхронного выполнения необходимо настроить транспорт и запустить воркер (bin/console messenger:consume).
  • Middleware: Messenger использует систему шин, где сообщения проходят через несколько middleware (например, SendMessageMiddleware, HandleMessageMiddleware, ValidationMiddleware).

Валидация форм​

  • Валидация: Выполняется с помощью компонента Validator, часто через атрибуты (PHP 8) на свойствах сущностей.
  • Компонент Form: Сопоставляет данные запроса с объектами, обрабатывает валидацию и управляет CSRF-защитой.

Циклические ссылки​

Чтобы избежать циклических ссылок при сериализации (например, User -> Order -> User):

  1. Группы сериализации: Сериализуйте только определённые поля.
  2. DTO: Используйте отдельные Data Transfer Objects для сериализации.
  3. Максимальная глубина: Используйте атрибут #[MaxDepth] и контекст AbstractObjectNormalizer::ENABLE_MAX_DEPTH.