我目前正在开发一个可重复使用的软件包,其中我正在制作其他路由(在routing.yml内部设置+使用Routing Loader机制加载)。全部以ExceptionListener
开头(是的,这是一个管理包)。我目前在我的网络应用程序中有自己的404页面(主要的)。我试图说,如果用户在管理包错误内,他将看到另一个错误页面。
我使用自己的自定义 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 }
:
import ReactNativeComponentTree from 'react-native';
现在它工作正常,显示所有自定义捆绑包的错误页面。但它们随处可见,即使在主应用程序路径失败时也是如此。
如何分隔何时显示应用程序错误页面以及何时显示自定义捆绑包?
答案 0 :(得分: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 */
}