Опиши путь HTTP-запроса от ввода URL до вызова метода контроллера в Symfony.

«Опиши путь HTTP-запроса от ввода URL до вызова метода контроллера в Symfony.» — вопрос из категории Symfony, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Путь запроса в Symfony строго определён и централизован через фронт-контроллер public/index.php.

  1. Браузер отправляет HTTP-запрос (например, GET /blog/42).
  2. Веб-сервер (Nginx/Apache) перенаправляет все запросы на public/index.php (через конфигурацию, например, try_files $uri /index.php$is_args$args).
  3. Фронт-контроллер (index.php):
    • Загружает автозагрузчик Composer.
    • Создаёт экземпляр ядра приложения (Kernel).
    • Вызывает Kernel::handle($request), передавая объект Request, сформированный из глобальных переменных ($_GET, $_POST, etc.).
  4. Ядро (Kernel):
    • Инициализирует контейнер служб (Service Container), загружая конфигурацию из config/.
    • Запускает HttpKernel — основной компонент, обрабатывающий запрос по событийной модели.
  5. Маршрутизатор (Router):
    • HttpKernel через RouterListener (подписчик на событие kernel.request) передаёт Request в Router.
    • Router сопоставляет путь (/blog/42) с объявленными маршрутами (из config/routes/, атрибутов #[Route] или аннотаций).
    • Находит совпадение и возвращает параметры маршрута: _controller (например, AppControllerBlogController::show) и id: 42.
  6. Контроллер (Controller):
    • HttpKernel через ControllerResolver создаёт или извлекает из контейнера экземпляр BlogController.
    • Вызывает метод show($id), автоматически подставляя 42 в аргумент.

Пример контроллера с атрибутом:

// src/Controller/BlogController.php
namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;

class BlogController extends AbstractController
{
    #[Route('/blog/{id}', name: 'blog_show')]
    public function show(int $id): Response
    {
        // Логика получения статьи по $id
        $article = ...;
        return $this->render('blog/show.html.twig', ['article' => $article]);
    }
}

После выполнения метода контроллера HttpKernel продолжает работу, обрабатывая результат (например, рендеринг шаблона) и отправляя финальный Response.