Sil*_*u G 2 http-status-code-404 symfony symfony5
我正在尝试为 Symfony 5 项目创建一个自定义 404 页面,该页面必须:
Content-Type: application/json标题。Symfony 文档中有一个部分试图解释如何实现这一点,但该信息似乎不完整/不正确,显然是为 4.X 版本编写的,甚至指向 GitHub 上不存在的源文件。
我已经成功创建了一个错误控制器,但它吞噬了所有错误:
# config/packages/framework.yaml
framework:
error_controller: App\Controller\ErrorController::errorHandler
Run Code Online (Sandbox Code Playgroud)
// src/Controller/ErrorController.php
class ErrorController extends AbstractController
{
public function errorHandler(TranslatorInterface $translator) : JsonResponse
{
return new JsonResponse($translator->trans('not_found'));
}
}
Run Code Online (Sandbox Code Playgroud)
问题是这会导致任何错误(包括内部错误)返回 404 页面。
如何让这个控制器/方法只处理 404 错误,而让框架本身像以前一样处理其他所有内容?
对于正在寻找 Symfony 应用程序的 JSON 404 页面解决方案的其他人:
我一直在寻找一种使用控制器来处理特定错误情况的方法,因为它似乎是表面上最简单的选择,但这似乎不可能,或者至少我还没有弄清楚如何。
最后,我使用事件和事件侦听器找到了解决方案:
配置:
# config/services.yaml
services:
...
# This listener handles only 404 errors in PROD mode
App\EventListener\ExceptionListener:
tags:
- { name: kernel.event_listener, event: kernel.exception }
Run Code Online (Sandbox Code Playgroud)
事件监听器:
// src/EventListener/ExceptionListener.php
class ExceptionListener {
public function onKernelException(ExceptionEvent $event) : void
{
if (
$_ENV['APP_ENV'] != 'prod'
|| !$event->isMasterRequest()
|| !$event->getThrowable() instanceof NotFoundHttpException
) {
return;
}
// Send a not found in JSON format
$event->setResponse(new JsonResponse($this->translator->trans('not_found')));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3216 次 |
| 最近记录: |