如何在symfony5中将所有HttpException格式化为json?

k0p*_*kus 6 php serialization exception symfony symfony5

在 symfony5 控制器中,我可以通过以下方式返回 json 响应:

 return $this->json(['key' => 'content');
Run Code Online (Sandbox Code Playgroud)

然而,当我抛出 HttpException 时,我会在开发和生产中看到默认的 html 错误页面。

我想创建一个restful api,所以我想将所有HttpException转换为json。

我想将所有控制器配置为将其响应格式化为 json。最多,我想添加一个异常处理程序,将异常转换为正确的消息。(在 prod 中它应该包含较少的信息,在 dev 中它可能包含异常堆栈跟踪。)

我怎样才能实现这个目标?我以为我可以使用注释format选项@Route,但它不起作用。

这是我的示例控制器:

<?php declare(strict_types=1);

namespace App\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;

class StatusController extends AbstractController
{
    /**
     * @Route("/status", name="status", format="json")
     * @Template
     * @return JsonResponse
     */
    public function status()
    {
        if (true) {
            // this will render as html, how to serialize it as json?
            throw new NotFoundHttpException("This is an example");
        }


        $ok = new \stdClass();
        $ok->status = "OK";

        return $this->json($ok);
    }
}
Run Code Online (Sandbox Code Playgroud)

在寻找这个的过程中,我发现了这个 PR,它似乎实现了我想要做的事情,但我不确定我错过了什么。

symfony 博客上,我发现了 Yonel Ceruto 的以下回答:

您需要安装/启用序列化器组件,

但我不知道这意味着什么。


在 dev 和 prod 中,我得到了这些 html 视图而不是 json 响应:

产品

用于呈现异常的 html 的 prod 视图

开发者

呈现异常的 html 视图的 dev 视图

k0p*_*kus 9

事实证明,我所缺少的只是安装了symfony 文档中指出的序列化器包:

composer require symfony/serializer-pack
Run Code Online (Sandbox Code Playgroud)

然后,我的异常就可以正常渲染为 json 了。