Php 仅当在自定义路由内时,Symfony错误页
我目前正在开发一个可重用的包,其中我正在创建额外的路由(设置在routing.yml+中,使用路由加载机制加载)。所有文件都以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
/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以拉入安全上下文,并检查用户是否已登录,以及是否具有管理员角色作为附加条件