Symfony 错误页面仅在自定义路由内

Symfony error page only when inside the custom route

我目前正在开发一个可重复使用的包,其中我正在制作额外的路线(在 routing.yml 内设置 + 使用 Routing Loader 机制加载)。全部以 /admin 开头(是的,这是一个管理包)。我的网络应用程序(主要应用程序)中目前有我自己的 404 页面。我正在努力做到这一点,如果用户在管理包错误中,他将看到另一个错误页面。

我使用自己的自定义 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 }

现在它工作正常,显示了所有自定义包的错误页面。但它们无处不在,即使在主要应用程序路径中也失败了。

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

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