2017-08-16 58 views
1

我目前正在開發一個可重用的bundle,其中我正在製作其他路由(在Routing.yml +中加載了Routing Loader機制)。所有從/admin開始(是的,這是一個管理包)。我目前在我的web應用程序(主要的)中有我自己的404頁面。我試圖讓如果用戶在管理包錯誤中,他會看到另一個錯誤頁面。Symfony錯誤頁面只在自定義路由中

我用我自己定製ExceptionListener使其如下

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

,並在包的services.yml(自定義管理包在裏面!):

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

現在工作得很好,所有的定製捆綁的顯示錯誤頁面。但它們到處都顯示出來,即使在主應用程序路由失敗的情況下。

如何區分何時顯示應用程序錯誤頁面以及何時顯示自定義捆綁包?

+1

你只能有1個例外處理程序afaik,但你可以聽到來自你的管理包的事件,如下所述:http://symfony.com/doc/current/event_dispatcher.html – DarkMukke

+0

@DarkMukke,你能告訴我如何使Exception Subscriber僅訂閱發生在一個Web應用程序包中的異常?我不知道下面的其他答案已經消失:0 – user7808407

+0

我在自定義包中創建了Exception Subscriber,但它的行爲與我的帖子中的Exception Listener完全一樣。我無法讓它訂閱/只收聽一個包的路由錯誤。 :( – user7808407

回答

2

如果用戶試圖訪問以/admin開頭但不存在的路線,我會假設您想要一個不同的404頁面。您可以通過這樣做,在你的onKernelException()方法:

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

我也注意到你沒有明確檢查一個404頁面,你應該做的通過:

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

我不' t很喜歡這個決定,因爲它會向任何/ admin/sdfsdf路由顯示管理員錯誤頁面,而且不僅管理員會看到它,但我想沒有其他解決方案 – user7808407

+1

不正確。您可以擴展我的答案來拉入安全上下文,並檢查用戶是否已登錄並具有管理角色作爲附加條件 –