Событие FinishRequestEvent
Событие FinishRequestEvent относится к секции kernel
и срабатывает в тот момент, когда ядро Symfony
завершило обработку запроса, но ещё не отправило
ответ клиенту. Событие даёт возможность выполнить
финальные действия: очистить временные данные,
закрыть соединения, записать итоговую статистику.
В отличие от TerminateEvent, которое срабатывает
после отправки ответа, FinishRequestEvent
вызывается раньше, до того как ответ ушёл клиенту.
Объект события хранит текущий запрос и ответ,
которые доступны через методы getRequest
и getResponse.
Синтаксис
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
$event = new FinishRequestEvent($kernel, $request, $requestType);
$event->getRequest();
$event->getResponse();
$event->isMainRequest();
Пример
Давайте подпишемся на событие FinishRequestEvent
и выведем сообщение о завершении обработки запроса:
<?php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
class FinishRequestListener
{
public function onFinishRequest(FinishRequestEvent $event): void
{
$request = $event->getRequest();
echo 'Request finished: ' . $request->getPathInfo();
}
}
?>
Результат выполнения кода для адреса /user:
"Request finished: /user"
Пример
Давайте зарегистрируем слушателя через атрибут
AsEventListener и укажем событие kernel.finish_request:
<?php
namespace App\EventListener;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
#[AsEventListener(event: KernelEvents::FINISH_REQUEST)]
class FinishRequestListener
{
public function __invoke(FinishRequestEvent $event): void
{
$request = $event->getRequest();
$response = $event->getResponse();
echo 'Path: ' . $request->getPathInfo() . PHP_EOL;
echo 'Status: ' . $response->getStatusCode();
}
}
?>
Результат выполнения кода для адреса /user
со статусом 200:
"Path: /user
Status: 200"
Пример
Давайте проверим, является ли запрос главным,
через метод isMainRequest:
<?php
namespace App\EventListener;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
#[AsEventListener(event: KernelEvents::FINISH_REQUEST)]
class FinishRequestListener
{
public function __invoke(FinishRequestEvent $event): void
{
if ($event->isMainRequest()) {
echo 'Main request finished';
} else {
echo 'Sub request finished';
}
}
}
?>
Результат выполнения кода для главного запроса:
"Main request finished"
Смотрите также
-
событие
RequestEvent,
которое срабатывает при поступлении запроса -
событие
ResponseEvent,
которое срабатывает при формировании ответа -
событие
TerminateEvent,
которое срабатывает после отправки ответа -
класс
KernelEvents,
который хранит константы имён событий ядра