我正在构建一个需要将某些实体作为JSON输出的API。我想弄清楚是否更好地规范化实体并将其传递给JsonResponse
,或者我是否应将其序列化并将其传递给Response
。这两者有什么区别?
/**
* Returning a Response
*/
public function getEntityAction($id)
{
$entity = $this->getDoctrine()->getRepository(MyEntity::class)->find($id);
$json = $this->get('serializer')->serialize($entity);
$response = new Response($json);
$response->headers->set('Content-Type', 'application/json');
return $response
}
/**
* Returning a JsonResponse.
*/
public function getEntityAction($id)
{
$entity = $this->getDoctrine()->getRepository(MyEntity::class)->find($id);
$array = $this->get('serializer')->normalize($entity);
return new JsonResponse($array);
}
两者之间是否存在实际差异,除了我不必为Content-Type
手动设置JsonResponse
标题这一事实?
答案 0 :(得分:2)
您可以将序列化程序使用的编码器JsonEncode与JsonResponse的编码器进行比较。基本上它是一样的。在引擎盖下,都使用json_encode
生成一个字符串。
我认为对你的项目感觉合适是一个不错的选择。 JsonResponse主要是为了方便,你已经注意到它只会自动设置正确的Content Type-header并为你做json编码。
答案 1 :(得分:0)
根据我对Symfony序列化的理解,规范化是序列化过程的一部分,其中对象被映射到关联数组,然后将该数组编码为普通JSON对象,完成序列化。
使用normalize函数的代码实际上可以修改为使用Response类而不是JsonResponse:
/**
* Returning a JsonResponse.
*/
public function getEntityAction($id)
{
$entity = $this->getDoctrine()->getRepository(MyEntity::class)->find($id);
$array = $this->get('serializer')->normalize($entity);
$response = new Response(json_encode($array));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
我没有检查序列化函数的Symfony代码,但相信它的一部分将是normalize函数。您可以在symfony doc中找到解释:http://symfony.com/doc/current/components/serializer.html