2017-08-16 98 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

不正确。您可以扩展我的答案来拉入安全上下文,并检查用户是否已登录并具有管理角色作为附加条件 –