Symfony 5 自定义 404 页面

Sil*_*u G 2 http-status-code-404 symfony symfony5

我正在尝试为 Symfony 5 项目创建一个自定义 404 页面,该页面必须:

  1. 输出一个简单的 JSON 编码字符串,例如“未找到”。
    • 所述字符串必须从翻译资源中读取。
  2. 有一个额外的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 错误,而让框架本身像以前一样处理其他所有内容?

Sil*_*u G 5

对于正在寻找 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)