Redirigir con el receptor de eventos para todos “No se encontró ninguna ruta 404 No se encontró – NotFoundHttpException”

¿Cómo puedo desencadenar la redirección a un enrutador específico en el detector de eventos?

Hay muchos ejemplos pero no pude encontrar uno para “GetResponseForExceptionEvent”. Por ejemplo, cuando paso @roter como un argumento $this->router.... parece que no funciona así.

Los revisé pero probablemente me perdí algo:

  • Mostrar una ruta específica en lugar de la página de error (404) – Symfony2
  • symfony2: enganche en NotFoundHttpException para redirección
  • ¿Redirigir Symfony2 para el detector de eventos?
  • Symfony2: Obtención de ruta en la página Load Listener de eventos
  • Redirigir si el usuario ha iniciado sesión

service.yml

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

Escucha de eventos:

 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(...........); } } } 

Tienes 2 opciones:

  • Use un oyente de eventos
  • Use una ruta que coincida con todas las rutas que no existen y active una acción en un controlador.

Avísame si eso funciona.


Opción 1

Nota: Eche un vistazo a la redirección de Symfony2 para el detector de eventos

1 Pase el enrutador a su oyente de eventos:

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

2 Use el enrutador dentro del oyente para redirigir a los usuarios:

 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); } } } 

opcion 2

Puede crear una ruta especial que coincidirá con todas las rutas que no existen; A continuación, puede manejar la redirección de la manera que desee dentro del controlador de su elección, aquí PageNotFoundController:

1 Al final de la aplicación / config / routing.yml

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

2