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 */
}
我目前正在开发一个可重复使用的包,其中我正在制作额外的路线(在 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 */
}