События фреймворка Symfony

Когда фреймворк Symfony (или что угодно, использующее:class:Symfony\Component\HttpKernel\HttpKernel) обрабатывает запрос, некоторые базовые события диспетчеризируются, чтобы вы могли добавлять слушателей в течение всего процесса. Они называются "событиями ядра". Для более подробного объяснения, см. The HttpKernel Component.

События ядра

Каждое событие, выполненное ядром - это подкласс KernelEvent. Это означает, что каждое событие имеет доступ к следующей информации:

getRequestType()
Возвращает тип запроса (HttpKernelInterface::MASTER_REQUEST или HttpKernelInterface::SUB_REQUEST).
getKernel()
Возвращает Ядро, обрабатывающее запрос.
getRequest()
Возвращает текущий обрабатываемый Request.

kernel.request

Класс события: GetResponseEvent

Это событие диспетчеризируется Symfony очень рано, до определения контроллера.

Простите больше о событии kernel.request.

Существуют встроенные слушатели Symfony, зарегистрированные в этом событии:

Имя класса слушателя Приоритет
ProfilerListener 1024
TestSessionListener 192
SessionListener 128
RouterListener 32
LocaleListener 16
Firewall 8

kernel.controller

Класс события: FilterControllerEvent

Это событие может быть точкой входа, используемой для изменения контроллера, который должен быть выполнен:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

public function onKernelController(FilterControllerEvent $event)
{
    $controller = $event->getController();
    // ...

    // контроллер может быть изменён на любое PHP-вызываемое
    $event->setController($controller);
}
Прочтите больше о событии kernel.controller.

Это встроенный слушатель Symfony, относящийся к этому событию:

Имя класса слушателя Приоритет
RequestDataCollector 0

kernel.view

Класс события: GetResponseForControllerResultEvent

Это событие не используется FrameworkBundle, но может быть использовано, чтобы реализовать под-систему просмотра. Это событие вызывается только, если Контроллер не возвращает объект Response. Целью события является позволить некоторому другому возвращённому значению быть конвертированным в Response.

К значению, возвращённому Контроллером, можно получить доступ через метод getControllerResult():

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
use Symfony\Component\HttpFoundation\Response;

public function onKernelView(GetResponseForControllerResultEvent $event)
{
    $val = $event->getControllerResult();
    $response = new Response();

    // ... настроить Ответ из возвращённого значения

    $event->setResponse($response);
}
Прочтите больще о событии kernel.view.

kernel.response

Класс события: FilterResponseEvent

Цель этого события - позволить другим системам изменять или заменять объект Response после его создания:

1
2
3
4
5
6
public function onKernelResponse(FilterResponseEvent $event)
{
    $response = $event->getResponse();

    // ... изменить объект ответа
}

FrameworkBundle регистрирует несколько слушателей:

ProfilerListener
Собирает данные для текущего запроса.
WebDebugToolbarListener
Внедряет панель инструментов веб-отладки.
ResponseListener
Исправляет Ответ Content-Type, основываясь на формате запроса.
EsiListener
Добавляет HTTP-заголовок Surrogate-Control, когда нужно проанализировать Ответ на предмет ESI-тегов.
Прочтите больще о событии kernel.response.

Это встроенные слушатели Symfony, зарегистрированные в этом событии:

Имя класса слушателя Приоритет
EsiListener 0
ResponseListener 0
ResponseListener 0
RequestDataCollector 0
ProfilerListener -100
TestSessionListener -128
WebDebugToolbarListener -128
StreamedResponseListener -1024

kernel.finish_request

Класс события: FinishRequestEvent

Цель этого события - позволить вам сбрасывать глобальное состояние и состояние окружения приложения после того, как под-запрос был завершён (например, слушатель переводчика сбрасывает локаль переводчика в один из родительских запросов):

1
2
3
4
5
6
7
8
9
public function onKernelFinishRequest(FinishRequestEvent $event)
{
    if (null === $parentRequest = $this->requestStack->getParentRequest()) {
        return;
    }

    //Сбросить локаль подзапроса в локаль родительского запроса
    $this->setLocale($parentRequest);
}

Это встроенные слушатели Symfony, зарегистрированные в этом событии:

Имя класса слушателя Приоритет
LocaleListener 0
TranslatorListener 0
RouterListener 0
Firewall 0

kernel.terminate

Класс события: PostResponseEvent

Цель этого события - выполнять задачи после того, как ответ уже был выдан клиенту.

Прочтите больше о событии kernel.terminate.

Вот встроенный слушатель Symfony, зарегистрированный в этом событии:

Имя класса слушателя Приоритет
EmailSenderListener 0

kernel.exception

Класс события: GetResponseForExceptionEvent

TwigBundle регистрирует ExceptionListener, который пересылает Request к заданному контроллеру, определённому параметром exception_listener.controller.

Слушатель этого события может создать и установить объект Response, создать и установить новый объект Exception object, or do nothing:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

public function onKernelException(GetResponseForExceptionEvent $event)
{
    $exception = $event->getException();
    $response = new Response();
    // setup the Response object based on the caught exception
    $event->setResponse($response);

    // you can alternatively set a new Exception
    // $exception = new \Exception('Some special exception');
    // $event->setException($exception);
}

Note

Symfony использует следующую логику для определения HTTP статус-кода ответа:

  • Если isClientError(), isServerError() или isRedirect() - true, то в вашем объекте Response используется статус-код;
  • Если первоначальное исключение реализует HttpExceptionInterface, то в исключении вызывается и используется getStatusCode() (также добавляются заголовки из getHeaders());
  • Если не совпадает ничего из вышеперечисленного, то используется статус-код 500.
Прочтите больше о событии kernel.exception.

Это встроенные слушатели Symfony, зарегистрированные в этом событии:

Имя класса слушателя Приоритет
ProfilerListener 0
ExceptionListener -128

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.