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