Symfony序列化响应与规范化JsonResponse

时间:2017-02-11 05:10:32

标签: php json symfony

我正在构建一个需要将某些实体作为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标题这一事实?

2 个答案:

答案 0 :(得分:2)

您可以将序列化程序使用的编码器JsonEncodeJsonResponse的编码器进行比较。基本上它是一样的。在引擎盖下,都使用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 enter image description here