在 symfony5 控制器中,我可以通过以下方式返回 json 响应:
return $this->json(['key' => 'content');
然而,当我抛出 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);
}
}
在寻找这个时我遇到了this PR https://github.com/symfony/symfony/pull/31065这似乎实现了我想要做的事情,但我不确定我错过了什么。
On symfony 博客 https://symfony.com/blog/new-in-symfony-4-4-errorhandler-component我发现 Yonel Ceruto 的以下回答说
您需要安装/启用序列化器组件,
但我不知道这意味着什么。
在 dev 和 prod 中,我得到了这些 html 视图而不是 json 响应:
prod
dev