Событие ViewEvent
Событие ViewEvent вызывается ядром
HttpKernel после того, как контроллер
вернул результат. Оно позволяет перехватить
результат работы контроллера до того, как он
будет преобразован в объект Response.
Событие даёт доступ к контроллеру и его
аргументам через методы getController и
getArguments, а также к самому результату
через метод getResponse.
Обработчик события регистрируется как сервис
с тегом kernel.event_listener или
kernel.event_subscriber. Событие вызывается
только один раз за основной запрос и не
срабатывает для подзапросов.
Синтаксис
use Symfony\Component\HttpKernel\Event\ViewEvent;
class ViewListener
{
public function onView(ViewEvent $event): void
{
$controller = $event->getController();
$arguments = $event->getArguments();
$res = $event->getResponse();
}
}
Пример
Давайте создадим слушателя события
ViewEvent, который подменяет результат
контроллера на объект Response:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ViewEvent;
class ViewListener
{
public function onView(ViewEvent $event): void
{
if ($event->getResponse() === null) {
$event->setResponse(new Response('hello'));
}
}
}
?>
Зарегистрируем слушателя в конфигурации сервисов:
services:
App\EventListener\ViewListener:
tags:
- { name: kernel.event_listener, event: kernel.view }
Теперь для любого контроллера, вернувшего
значение, не являющееся Response, будет
отдан ответ 'hello'.
Результат выполнения кода:
hello
Пример
Давайте получим контроллер и аргументы внутри слушателя:
<?php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\ViewEvent;
class ViewListener
{
public function onView(ViewEvent $event): void
{
$controller = $event->getController();
$arguments = $event->getArguments();
$name = get_class($controller[0]);
$method = $controller[1];
echo $name . '::' . $method;
}
}
?>
Результат выполнения кода для контроллера
ArticleController::index:
"App\Controller\ArticleController::index"
Пример
Давайте проверим, является ли событие частью основного запроса:
<?php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\ViewEvent;
class ViewListener
{
public function onView(ViewEvent $event): void
{
if ($event->isMainRequest()) {
echo 'main request';
} else {
echo 'sub request';
}
}
}
?>
Результат выполнения кода для основного запроса:
"main request"
Смотрите также
-
событие
ControllerEvent,
которое вызывается до выполнения контроллера -
событие
ResponseEvent,
которое вызывается после формирования ответа -
метод
getResponse,
который возвращает результат контроллера -
метод
setResponse,
который подменяет результат контроллера