Событие ControllerEvent
Событие ControllerEvent возникает в ядре
Symfony сразу после того, как маршрутизатор определил,
какой контроллер должен быть вызван. Оно даёт возможность
перехватить этот вызов до выполнения метода контроллера.
Первым параметром в конструктор передаётся объект
HttpKernelInterface, вторым - вызываемый
контроллер в виде callable, третьим - объект
Request.
Главная особенность события в том, что оно позволяет
не только заменить контроллер на другой, но и изменить
аргументы, которые будут переданы в метод. Для этого
используются методы setController,
getController, setArguments
и getArguments. Обработчик должен быть
зарегистрирован на константу KernelEvents::CONTROLLER.
Синтаксис
use Symfony\Component\HttpKernel\Event\ControllerEvent;
public function onController(ControllerEvent $event): void
{
// logic
}
Пример
Давайте зарегистрируем слушателя события
ControllerEvent и выведем имя вызванного
контроллера:
<?php
namespace AppEventListener;
use SymfonyComponentHttpKernelEventControllerEvent;
class ControllerListener
{
public function onController(ControllerEvent $event): void
{
$controller = $event->getController();
if (is_array($controller)) {
echo $controller[1];
} else {
echo $controller;
}
}
}
?>
Теперь свяжем слушателя с событием через конфигурацию сервиса:
services:
AppEventListenerControllerListener:
tags:
- { name: kernel.event_listener, event: kernel.controller, method: onController }
Результат выполнения кода при вызове метода
index:
"index"
Пример
Давайте изменим аргументы контроллера перед его вызовом.
Подменим значение параметра name на строку
'abcde':
<?php
namespace AppEventListener;
use SymfonyComponentHttpKernelEventControllerEvent;
class ControllerListener
{
public function onController(ControllerEvent $event): void
{
$args = $event->getArguments();
foreach ($args as $key => $value) {
if ($key === 'name') {
$args[$key] = 'abcde';
}
}
$event->setArguments($args);
}
}
?>
Результат выполнения кода для адреса
/user/test:
abcde
Смотрите также
-
событие
RequestEvent,
которое возникает при получении запроса -
событие
ResponseEvent,
которое возникает при формировании ответа -
событие
ExceptionEvent,
которое возникает при исключении в ядре -
класс
RequestEvent,
который является базовым для событий ядра