2017-08-16 2 views
1

Ich entwickle gerade ein wiederverwendbares Bundle, wobei ich zusätzliche Routen mache (innerhalb von routing.yml + mit Routing-Loader-Mechanismus geladen). Alle beginnen mit /admin (ja, das ist ein Admin-Bundle). Ich habe momentan meine eigene 404-Seite in meiner Web-Anwendung (der Haupt). Und ich versuche zu machen, dass, wenn der Benutzer innerhalb des Admin-Bündelfehlers ist, er andere Fehlerseiten sehen wird.Symfony-Fehlerseite nur innerhalb der benutzerdefinierten Route

Ich habe es mit meinen eigenen benutzerdefinierten ExceptionListener folgend

class ExceptionListener 
    { 
    //... 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     $exception = $event->getException(); 
     $response = new Response(); 

     //... 

     $response->setContent($this->templating->render($templateName, [ 
      'statusCode' => $response->getStatusCode(), 
      'page' => $page 
     ])); 
     $event->setResponse($response); 
    } 
    } 

und im Bundle services.yml (innerhalb des benutzerdefinierten Admin-Bundle!):

admin.exception_listener: 
    class: ....\EventListener\ExceptionListener 
    calls: 
     - ["setTemplating", ["@templating"]] 
     - ["setKernel", ["@kernel"]] 
    tags: 
     - { name: kernel.event_listener, event: kernel.exception } 

Nun, es funktioniert, ist alles individuelle Bündel Fehlerseiten werden angezeigt. Aber sie werden überall gezeigt, selbst wenn die Hauptanwendungsroute fehlschlägt.

Wie kann ich unterscheiden, wann Anwendungsfehlerseiten angezeigt werden und wann benutzerdefinierte Pakete angezeigt werden sollen?

+1

Sie nur 1 haben kann Ausnahme Handler afaik, aber Sie könnten auf ein Ereignis warten, das von Ihrem Admin-Paket kommt, wie hier beschrieben: http://symfony.com/doc/current/event_dispatcher.html – DarkMukke

+0

@DarkMukke, können Sie mir bitte sagen, wie ich Exception Subscriber nur abonnieren kann zu Ausnahmen, die in einem Paket der Web-App passieren? Ich weiß nicht, wo die andere Antwort unten gegangen war: 0 – user7808407

+0

Ich erstellte den Ausnahme-Abonnenten in meinem benutzerdefinierten Bundle, aber es verhält sich genau als Ausnahme-Listener von meinem Post. Ich kann es nicht schaffen, nur Routenfehler eines Pakets zu abonnieren/anzuhören. :( – user7808407

Antwort

2

Ich gehe davon aus, dass Sie eine andere 404-Seite möchten, wenn der Benutzer versucht, eine Route zu besuchen, die mit /admin beginnt, aber nicht existiert. Sie können über in Ihrem onKernelException() Methode tun:

$request = $event->getRequest(); 

// check if request starts with /admin 
if (substr($request->getRequestUri(), 0, strlen('/admin')) === '/admin') { 
    // load admin 404 template 
    $response->setContent(/* ... */); 
} else { 
    // load site 404 template 
    $response->setContent(/* ... */); 
} 

$event->setResponse($response); 

ich auch feststellen, dass Sie nicht explizit für eine 404-Seite überprüft, die Sie wahrscheinlich über tun sollten:

if ($exception instanceof NotFoundHttpException) { 
    /* set your template response here */ 
} 
+0

I don ' Ganz ähnlich wie bei dieser Entscheidung, da es eine Admin-Fehlerseite zu einer/admin/sdfsdf-Route zeigt und nicht nur Admins es sehen, aber ich denke, es gibt keine andere Lösung – user7808407

+1

Nicht wahr. Sie können meine Antwort erweitern, um die Sicherheit zu ziehen Kontext und überprüfen Sie, ob der Benutzer angemeldet ist und die Administratorrolle als zusätzliche Bedingungen hat –

Verwandte Themen