Если все, что вы хотите сделать, это визуализировать шаблон, вы также можете использовать 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);
}