Php 仅当在自定义路由内时,Symfony错误页

Php 仅当在自定义路由内时,Symfony错误页,php,symfony,bundle,symfony-3.3,Php,Symfony,Bundle,Symfony 3.3,我目前正在开发一个可重用的包,其中我正在创建额外的路由(设置在routing.yml+中,使用路由加载机制加载)。所有文件都以/admin开头(是的,这是一个管理包)。我目前在我的web应用程序(主应用程序)中有自己的404页面。我正在尝试,如果用户在管理包错误中,他将看到另一个错误页面 我用我自己的自定义例外Listener(在自定义管理包中!)创建了它,如下所示 class ExceptionListener { //... public function onK

我目前正在开发一个可重用的包,其中我正在创建额外的路由(设置在routing.yml+中,使用路由加载机制加载)。所有文件都以
/admin
开头(是的,这是一个管理包)。我目前在我的web应用程序(主应用程序)中有自己的404页面。我正在尝试,如果用户在管理包错误中,他将看到另一个错误页面

我用我自己的自定义
例外Listener
(在自定义管理包中!)创建了它,如下所示

  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);
     }
  }
在捆绑包的
服务中.yml

 admin.exception_listener:
    class: ....\EventListener\ExceptionListener
    calls:
        - ["setTemplating", ["@templating"]]
        - ["setKernel", ["@kernel"]]
    tags:
       - { name: kernel.event_listener, event: kernel.exception }
现在它可以正常工作了,所有自定义包的错误页面都会显示出来。但它们随处可见,即使在主应用程序路径中也是如此


如何区分何时显示应用程序错误页面和何时显示自定义捆绑包?

如果用户试图访问以
/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 */
}

您只能有1个异常处理程序afaik,但您可以侦听来自您的管理包的事件,如下所述:@darkmuke,您能告诉我如何使异常订阅者只订阅web应用程序的一个包中发生的异常吗?我不知道下面的另一个答案到哪里去了:0我在自定义包中创建了异常订阅服务器,但它的行为与我文章中的异常侦听器完全相同。我无法仅订阅/侦听一个捆绑包的路由错误:(如果404页面不存在,您如何知道用户试图加载的页面/捆绑包?如果它以
/admin
开头,但不存在或其他什么?我不太喜欢这个决定,因为它会向任何/admin/sdfsdf路由显示管理错误页面,而且不仅管理员会看到它。但我想没有其他解决方案了。)ot true。您可以展开my answer以拉入安全上下文,并检查用户是否已登录,以及是否具有管理员角色作为附加条件