2014-10-20 16 views
5

Come è possibile attivare il reindirizzamento a un router specifico nel listener di eventi?Reindirizzamento con listener di eventi per tutti "Nessun percorso trovato 404 non trovato - NotFoundHttpException"

Esistono molti esempi ma non sono riuscito a trovarne uno per "GetResponseForExceptionEvent". Per exampe, quando passo @roter come argomento $this->router.... non sembra funzionare così.

ho controllato questi ma probabilmente perso qualcosa:

service.yml

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

ascoltatore evento:

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

risposta

31

hai 2 opzioni:

  • utilizzare un evento Listener
  • Utilizzare una rotta che corrisponda a tutti i percorsi che non esistono e attivare un'azione in un controller.

Fammi sapere se funziona.


Opzione 1

Nota: Dai un'occhiata alla Symfony2 redirect for event listener

Passare il router al listener di eventi:

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

utilizzare il router all'interno dell'ascoltatore da ridire utenti ct:

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

     } 
    } 
} 

Opzione 2

È possibile creare un percorso speciale che abbinerà tutte le rotte che non esistono; È quindi possibile gestire il reindirizzamento come desiderato nel controller di propria scelta, in questo caso PageNotFoundController:

Alla fine di app/config/routing.yml

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

<?php 

namespace Acme\DemoBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

class PageNotFoundController extends Controller 
{ 

    public function pageNotFoundAction() 
    { 
     // redirect the way you want 

    } 

} 
+4

Che una risposta eccellente! Grazie mille. +++ 1 – BentCoder

+0

Ma questo non funziona solo su Dev e non su ambienti Prod? –

+0

L'opzione 2 ha funzionato bene. Grazie! – TechyTee