Событие KernelEvents
Класс KernelEvents содержит строковые константы
с именами событий, которые ядро Symfony
(класс HttpKernel) вызывает во время
обработки HTTP-запроса. Каждая константа - это
имя события, на которое можно повесить слушателя
через EventDispatcherInterface. Порядок
событий соответствует этапам обработки запроса.
Класс предоставляет следующие константы:
KernelEvents::REQUEST - возникает в начале
обработки запроса; KernelEvents::CONTROLLER -
возникает после определения контроллера, но до его
вызова; KernelEvents::CONTROLLER_ARGUMENTS -
возникает после разрешения аргументов контроллера;
KernelEvents::VIEW - возникает, когда
контроллер возвращает не объект Response;
KernelEvents::RESPONSE - возникает перед
отправкой ответа клиенту; KernelEvents::FINISH_REQUEST -
возникает после отправки ответа; KernelEvents::TERMINATE -
возникает после завершения отправки ответа;
KernelEvents::EXCEPTION - возникает при
выбросе исключения во время обработки запроса.
Синтаксис
use SymfonyComponentHttpKernelKernelEvents;
KernelEvents::REQUEST;
KernelEvents::CONTROLLER;
KernelEvents::CONTROLLER_ARGUMENTS;
KernelEvents::VIEW;
KernelEvents::RESPONSE;
KernelEvents::FINISH_REQUEST;
KernelEvents::TERMINATE;
KernelEvents::EXCEPTION;
Пример
Давайте подпишемся на событие KernelEvents::REQUEST
и выведем сообщение в лог при каждом запросе:
<?php
namespace AppEventListener;
use SymfonyComponentHttpKernelKernelEvents;
use SymfonyComponentHttpKernelEventRequestEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class RequestListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event): void
{
echo 'request received';
}
}
?>
Результат выполнения кода при обращении к любому маршруту:
"request received"
Пример
Давайте подпишемся сразу на несколько событий ядра, чтобы отследить этапы обработки запроса:
<?php
namespace AppEventListener;
use SymfonyComponentHttpKernelKernelEvents;
use SymfonyComponentHttpKernelEventRequestEvent;
use SymfonyComponentHttpKernelEventResponseEvent;
use SymfonyComponentHttpKernelEventTerminateEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class KernelListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => 'onRequest',
KernelEvents::RESPONSE => 'onResponse',
KernelEvents::TERMINATE => 'onTerminate',
];
}
public function onRequest(RequestEvent $event): void
{
echo 'stage: request';
}
public function onResponse(ResponseEvent $event): void
{
echo 'stage: response';
}
public function onTerminate(TerminateEvent $event): void
{
echo 'stage: terminate';
}
}
?>
Результат выполнения кода:
"stage: request"
"stage: response"
"stage: terminate"
Пример
Давайте перехватим событие KernelEvents::EXCEPTION
и подменим ответ при возникновении исключения:
<?php
namespace AppEventListener;
use SymfonyComponentHttpKernelKernelEvents;
use SymfonyComponentHttpKernelEventExceptionEvent;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class ExceptionListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
public function onKernelException(ExceptionEvent $event): void
{
$res = new Response('error handled');
$event->setResponse($res);
}
}
?>
Результат выполнения кода при выбросе исключения в контроллере:
"error handled"
Смотрите также
-
класс
RequestEvent,
который передаётся в событиеKernelEvents::REQUEST -
класс
ResponseEvent,
который передаётся в событиеKernelEvents::RESPONSE -
класс
ExceptionEvent,
который передаётся в событиеKernelEvents::EXCEPTION -
класс
TerminateEvent,
который передаётся в событиеKernelEvents::TERMINATE