Путь запроса в Symfony
Вопрос
Расскажите, как Symfony обрабатывает HTTP-запрос.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Front controller public/index.php создаёт Kernel и Request из глобальных переменных
HttpKernel: kernel.request (роутинг, безопасность), выбор контроллера
ArgumentResolver: сущности, DTO из запроса, сервисы
Контроллер возвращает Response или данные для kernel.view
kernel.response и kernel.terminate, kernel.exception при ошибке
Скомпилированный контейнер и кеш маршрутов
Что могут спросить следом
- Где бы вы добавили заголовок ко всем ответам?
- Что выполняется на kernel.terminate?
Разбор
Всё начинается с public/index.php: он создаёт Kernel и объект Request из суперглобальных переменных. Ядро загружает скомпилированный контейнер из кеша и передаёт запрос в HttpKernel.
HttpKernel построен на событиях. На kernel.request слушатель маршрутизации определяет маршрут и контроллер, а компонент безопасности аутентифицирует пользователя и проверяет доступ. Любой слушатель может сразу вернуть ответ. Затем kernel.controller, и резолверы аргументов готовят параметры: сущность по id, DTO из тела запроса через MapRequestPayload, сервисы.
Контроллер возвращает Response, или данные, которые слушатель kernel.view превращает в ответ. На kernel.response можно изменить ответ, например добавить заголовки. После отправки клиенту срабатывает kernel.terminate, где удобно делать отложенную работу. Если где-то вылетело исключение, kernel.exception превращает его в страницу ошибки или JSON.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.