Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 5自定义404页_Symfony_Http Status Code 404_Symfony5 - Fatal编程技术网

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

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

  • 输出一个简单的JSON编码字符串,如“未找到”。
    • 所述字符串必须从翻译资源中读取
  • 有一个额外的
    内容类型:application/json
  • Symfony文档中有一个部分,但信息似乎不完整/不正确,显然是为4.X版本编写的,甚至指向GitHub上不存在的源文件

    我已成功创建了一个错误控制器,但它会接受所有错误:

    #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,欢迎您发布一个更好的解决方案,而不是对此进行否决。