返回Symfony 4中序列化数据的数组

时间:2019-04-10 13:42:57

标签: php symfony serialization

Symfony4。我有两个实体CatDog,需要对其进行序列化,然后作为JSON响应返回,如下所示:

{
  'cats': // array of serialized cat data
  'dogs': // array of serialized dog data
}

这是我到目前为止所拥有的:

控制器:

public function index()
{
    $repository = $this->getDoctrine()->getRepository(Cat::class);
    $cats = $repository->findAll();
    $repository = $this->getDoctrine()->getRepository(Dog::class);
    $dogs = $repository->findAll();
    return new JsonResponse([
        'cats' => $this->serializeData($cats, 'cats'),
        'dogs' => $this->serializeData($dogs, 'dogs'),
    ], 200);
}

我的serializeData方法如下:

protected function serializeData($data, $group)
{
    return $this->json($data, $this->statusCode, [], [
        'groups' => [$group]
    ]);
}

以下是Cat实体:

use Symfony\Component\Serializer\Annotation\Groups;
[...]
/**
 * @ORM\Entity(repositoryClass="App\Repository\CatRepository")
 */
class Cat
{
    [...]
    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("cats")
     */
    private $name;
    [...]
}

问题:点击此端点时,我得到的不是数据:

{
    "cats": {
        "headers": {}
    },
    "dogs": {
        "headers": {}
    }
}

headers不属于任何一个实体。

编辑:

我还尝试了什么:

public function index()
{
    $repository = $this->getDoctrine()->getRepository(Cat::class);
    $cats = $repository->findAll();
    $repository = $this->getDoctrine()->getRepository(Dog::class);
    $dogs = $repository->findAll();
    return new JsonResponse([
        'cats' => $this->container->get('serializer')->serialize($cats, 'json', [
            'groups' => ['cats'],
        ])
        'dogs' => $this->container->get('serializer')->serialize($dogs, 'json', [
            'groups' => ['dogs'],
        ])
    ], 200);
}

这类作品,但是new JsonResponse序列化已经序列化的猫和狗。当然,如果我将new JsonResponse替换为new Response,则会收到错误消息

  

响应内容必须是实现__toString()的字符串或对象,并给出“数组”。

2 个答案:

答案 0 :(得分:1)

您可以使用Symfony序列化器组件:

https://symfony.com/doc/master/components/serializer.html

答案 1 :(得分:1)

好吧,方法$ this-> json返回一个JsonResponse,因此整个东西返回一个JsonResponse(JsonResponse ...)-source

public function index()
{
...
    return $this->json(['cats' => $cats, 'dogs' => $dogs], 200, [], ['groups' => ['cats', 'dogs']]);
}