0

我正在尝试为 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
// src/Controller/ErrorController.php
class ErrorController extends AbstractController
{
    public function errorHandler(TranslatorInterface $translator) : JsonResponse
    {
        return new JsonResponse($translator->trans('not_found'));
    }
}

问题是这会导致返回 404 页面的任何错误(包括内部错误)。

我怎样才能让这个控制器/方法只处理 404 错误,而让框架本身像以前一样处理其他一切?

4

1 回答 1

1

对于其他正在为 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 }

事件监听器:

// 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')));
    }
}
于 2020-02-13T12:48:59.413 回答