Symfony 5自定义404页
我正在尝试为Symfony 5项目创建一个自定义404页面,该页面必须:Symfony 5自定义404页,symfony,http-status-code-404,symfony5,Symfony,Http Status Code 404,Symfony5,我正在尝试为Symfony 5项目创建一个自定义404页面,该页面必须: 输出一个简单的JSON编码字符串,如“未找到”。 所述字符串必须从翻译资源中读取 有一个额外的内容类型:application/json头 Symfony文档中有一个部分,但信息似乎不完整/不正确,显然是为4.X版本编写的,甚至指向GitHub上不存在的源文件 我已成功创建了一个错误控制器,但它会接受所有错误: #config/packages/framework.yaml 框架: 错误\u控制器:App\contro
- 所述字符串必须从翻译资源中读取
内容类型:application/json
头#config/packages/framework.yaml
框架:
错误\u控制器:App\controller\ErrorController::errorHandler
//src/Controller/ErrorController.php
类ErrorController扩展了AbstractController
{
公共函数errorHandler(TranslatorInterface$translator):JsonResponse
{
返回新的JsonResponse($translator->trans('not_found'));
}
}
问题是,这会导致返回404页面的任何错误(包括内部错误)
如何使此控制器/方法仅处理404错误,而将所有其他问题都留给框架本身处理?对于正在为Symfony应用程序寻找JSON 404页面解决方案的任何其他人: 我一直在寻找一种使用控制器来处理特定错误情况的方法,因为这似乎是表面上最简单的选择,但这似乎不可能,或者至少我还没有弄清楚如何处理 最后,我通过以下方法找到了解决方案: 配置:
#config/services.yaml
服务:
...
#此侦听器在PROD模式下仅处理404个错误
App\EventListener\ExceptionListener:
标签:
-{name:kernel.event_侦听器,event:kernel.exception}
事件侦听器:
//src/EventListener/ExceptionListener.php
类例外侦听器{
公共函数onKernelException(ExceptionEvent$事件):无效
{
如果(
$\u ENV['APP\u ENV']!='prod'
||!$event->isMasterRequest()
||!$event->getThrowable()instanceof NotFoundHttpException
) {
返回;
}
//发送未找到JSON格式的
$event->setResponse(新的JsonResponse($this->translator->trans('not_found'));
}
}
关于文件过期的说法是对的,afaict。然而,这是你唯一尝试过的吗?它的字面意思是:“要覆盖非HTML错误输出,需要安装序列化程序组件。”(您这样做了吗?)。如果您的页面已经使用了默认的\u格式
json(意思是,一切都是jsonapi),这可能已经完成了您的大部分工作。因此,请阅读覆盖非html格式的错误输出一节:如果问题仍然存在,请返回…作为一个可行的替代方案,您还可以实现一个EventListener,侦听kernel.exception事件,以特定于notfound异常(不知道确切名称,我相信它是HttpNotFoundException
)并生成一个响应
并将其设置为事件,该事件应立即停止该事件的传播,并返回所有响应。EventListeners也可以被注入TranslatorInterface,因此它对您的控制器几乎没有什么区别,但更具体到404,欢迎您发布一个更好的解决方案,而不是对此进行否决。