Переадресация с помощью Event Listener для всех «Не найден маршрут 404 Not Found – NotFoundHttpException»

Как я могу вызвать redirect на конкретный маршрутизатор в приемнике событий?

Существует много примеров, но я не смог найти его для «GetResponseForExceptionEvent». Например, когда я @roter в качестве аргумента $this->router.... , похоже, не работает так.

Я проверил их, но я, наверное, что-то пропустил:

  • Показывать конкретный маршрут вместо страницы с ошибкой (404) – Symfony2
  • symfony2: подключиться к NotFoundHttpException для перенаправления
  • Переадресация Symfony2 для прослушивателя событий?
  • Symfony2: Получение маршрута в Слушателе загрузки страницы
  • Перенаправление, если пользователь зарегистрирован

service.yml

 services: kernel.listener.kernel_request: class: Booking\AdminBundle\EventListener\ErrorRedirect tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 

Слушатель событий:

 namespace Booking\AdminBundle\EventListener; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class ErrorRedirect { public function onKernelException(GetResponseForExceptionEvent $event) { $exception = $event->getException(); if ($exception instanceof NotFoundHttpException) { // redirect to '/' router or '/error' //$event->setResponse(...........); } } } 

У вас есть 2 варианта:

  • Использовать прослушиватель событий
  • Используйте маршрут, который соответствует всем маршрутам, которые не существуют, и запускают действие в controllerе.

Дай мне знать, если это работает.


Опция 1

Примечание. Просмотрите redirect Symfony2 для прослушивателя событий.

1 Пропустите маршрутизатор к слушателю событий:

 kernel.listener.kernel_request: class: Booking\AdminBundle\EventListener\ErrorRedirect arguments: router: "@router" tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } 

2 Используйте маршрутизатор в составе прослушивателя для перенаправления пользователей:

 namespace Booking\AdminBundle\EventListener; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Bundle\FrameworkBundle\Routing\Router; class ErrorRedirect { /** * Holds Symfony2 router * *@var Router */ protected $router; /** * @param Router */ public function __construct(Router $router) { $this->router = $router; } public function onKernelException(GetResponseForExceptionEvent $event) { $exception = $event->getException(); if ($exception instanceof NotFoundHttpException) { /** Choose your router here */ $route = 'route_name'; if ($route === $event->getRequest()->get('_route')) { return; } $url = $this->router->generate($route); $response = new RedirectResponse($url); $event->setResponse($response); } } } 

Вариант 2

Вы можете создать специальный маршрут, который будет соответствовать всем маршрутам, которые не существуют; Затем вы можете обрабатывать redirect так, как вы хотите, в controllerе по вашему выбору, здесь PageNotFoundController:

1 В конце app / config / routing.yml

 pageNotFound: pattern: /{path} defaults: { _controller: AcmeDemoBundle:PageNotFound:pageNotFound, path: '' } requirements: path: .* 

2

  
  • Должно ли все действительно быть связкой в ​​Symfony 2.x?
  • Symfony2 - Assetic - загрузка изображений в CSS
  • Расширение Symfony2 DefaultAuthenticationSuccessHandler
  • Недопустимая форма Symfony2 без ошибок
  • Symfony2 Настройка выбора поля выбора по умолчанию
  • Как использовать Ajax в формах администрирования Sonata?
  • Утечка памяти Symfony2 Doctrine2 / превышение предела памяти
  • EntityManager закрыт
  • Какая новая структура каталогов Symfony 3?
  • Symfony CSRF и Ajax
  • Как я могу получить доступ к службе за пределами controllerа с помощью Symfony2?
  • Давайте будем гением компьютера.