Как отреагировать на конкретный запрос маршрута напрямую от слушателя в symfony? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть маршрут, для которого я хочу вернуть шаблон ответа непосредственно от моего слушателя. Но этот конкретный запрос дает мне код ответа 404, так как я не сделал контроллер для этого маршрута. Как решить эту проблему, если я не хочу делать какой-либо контроллер для этого маршрута. Вот пример кода

1 Ответ

1 голос
/ 24 апреля 2020

Если все, что вы хотите сделать, это визуализировать шаблон, вы также можете использовать TemplateBontle FrameworkBundle :

#config/routes.yaml
index:
    path: /
    methods: ['GET']
    controller: Symfony\Bundle\FrameworkBundle\Controller\TemplateController
    defaults:
        template: 'index.html.twig'

Если вы не хотите использовать контроллер или вам нужно больше, чем просто рендеринг, вы должны убедиться, что ваш прослушиватель событий вызывается до того, как Symfony попытается сопоставить ваш путь, например, / с контроллером. Документы Symfony в компоненте HttpKernel объясняют цикл запроса и события более подробно.

Вы хотите прослушать событие kernel.request. Чтобы убедиться, что ваш слушатель работает перед RouterListener. Возможно, вам придется изменить приоритет слушателей для этого. Вы можете проверить, найден ли слушатель и в каком порядке он работает, выполнив команду отладки. В моем примере RouterListener # 5 в списке, и ваш должен быть до этого:

bin/console debug:event-dispatcher kernel.request

Registered Listeners for "kernel.request" Event
===============================================

 ------- --------------------------------------------------------------------------------------- ----------
  Order   Callable                                                                                Priority
 ------- --------------------------------------------------------------------------------------- ----------
  #1      Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure()           2048
  #2      Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest()   256
  #3      Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelRequest()           128
  #4      Symfony\Component\HttpKernel\EventListener\LocaleListener::setDefaultLocale()           100
  #5      Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest()            32
  #6      Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest()            16
 ------- --------------------------------------------------------------------------------------- ----------

В вашем слушателе событий вы должны быть осторожны, чтобы не возвращать ответ, как вы сделали бы с контроллером, но вместо этого установите Ответ на событие, например, так:

public function onKernelRequest(RequestEvent $event): void
{
    $request = $event->getRequest();

    if ($request->isMasterRequest() === false) {
        return;
    }

    // Check if the request matches your criteria, e.g. by checking the path
    // otherwise "return;" 

    $response = new Response($this->twig->render('my_template.html.twig'));

    $event->setResponse($response);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...