gpt4 book ai didi

json - 触发 error404.json.twig

转载 作者:行者123 更新时间:2023-12-04 19:49:00 25 4
gpt4 key购买 nike

我正在尝试让 Symfony 返回我自定义的 json 错误模板,但它一直返回 HTML 版本。使用我设置的休息客户端 接受 内容类型 到“application/json”,但只返回我的 error404.html.twig 的内容,而不是 error404.json.twig 文件。

目前我正在通过一个完全无效的 URL(即没有路由)来测试它,但是一旦我有了这个工作,我也会将它用于不会导致资源的有效 URL,并且代码在内部抛出一个 HttpNotFoundException

最佳答案

在您的请求上设置 header 实际上不会对返回的错误模板产生任何影响,尽管这看起来可能是逻辑路径。生成的错误模板基于请求格式,在 _format 中设置参数或手动上 Request对象本身。在 this post 中有一个解决方案但是如果您收到 404 错误,则无法准确设置 _format参数或 $request->setRequestFormat('json')来自不存在路由的 Controller 的调用。

Symfony 有很好的文档 how to customize error pages ,包括您可能想要采用的路径,即 overriding the default ExceptionController .基本上你会覆盖 showAction() findTemplate() 将采用 Accept 的方法 header 并检查 application/json .您也可以查看 Content-Type header 作为附加要求。所以这里是你的听众的声明:

# app/config/services.yml
services:
app.exception_controller:
class: AppBundle\Controller\CustomExceptionController
arguments: ['@twig', '%kernel.debug%']

然后设置 Twig 参数:
# app/config/config.yml
twig:
exception_controller: app.exception_controller:showAction

现在定义您的类并覆盖您需要的相关部分。第一个示例覆盖了 showAction()通过检查您的 Accept header ,然后修改 Request格式:
namespace AppBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;

class CustomExceptionController extends ExceptionController
{
/*
* {@inheritDoc}
*/
public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
{
if (in_array('application/json', $request->getAcceptableContentTypes())) {
$request->setRequestFormat('json');
}

parent::showAction($request, $exception, $logger);
}
}

Symfony 说 findTemplate()方法是定位要使用的模板的方法,因此您可以将代码放在那里。这是覆盖该函数的示例,并附加检查 Content-Type如果您需要同时满足两个条件,请使用标题:
namespace AppBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;

class CustomExceptionController extends ExceptionController
{
/*
* {@inheritDoc}
*/
protected function findTemplate(Request $request, $format, $code, $showException)
{
if (in_array('application/json', $request->getAcceptableContentTypes()) &&
0 === strpos($request->headers->get('Content-Type'), 'application/json')
) {
$format = 'json';
}

parent::findTemplate($request, $format, $code, $showException);
}
}

当然你也可以通过 working with the kernel.exception event 自己创建一个异常监听器为了进一步控制。

如果您使用 FOSRestBundle它试图 determine the request format for you通过监听器使用 Request Accept header 和格式优先级配置。如果您使用此捆绑包,您可能能够避免自定义编码而仅依赖于它。

关于json - 触发 error404.json.twig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35028077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com