如何序列化symfony中嵌套对象的特定属性?

时间:2019-07-31 12:01:29

标签: php symfony serializer

我有2个实体,与作者和书本有多对多的关系。

现在,当我将Book序列化为json时,它将为我提供嵌套作者对象的所有字段。


{
    "id": 3,
    "name": "clean code",
    "authors": [
        {
            "id": 4,
            "name": "Martin Robert "
        },
        ...
    ]
}

但是我如何使其仅返回特定字段,例如仅返回每个作者的姓名。

我尝试将组添加到Author实体,但是当我运行序列化程序时,组似乎不适用于嵌套对象,因为得到的结果相同。

    $book=$this->serializer->normalize($book, null, ['groups' => 'Concise']);
    $book=$this->serializer->serialize($book,'json');

1 个答案:

答案 0 :(得分:0)

您应该看一下JMS Serializer,它是用于序列化对象的强大库,您可以通过配置应保留在哪个字段中的@Groups批注轻松地完成您要的操作序列化过程。

Book.php

use JMS\Serializer\Annotation\Groups;

class Book {
  /** @Groups({"Concise"}) */
  private $id;

  /** @Groups({"Concise"}) */
  private $name;

  /** @Groups({"Concise"}) */
  private $authors;

  ...
}

如果仅在序列化图书实体时要检索作者的姓名,请在名称字段上仅添加@Groups批注。

Author.php

use JMS\Serializer\Annotation\Groups;

class Author {
  private $id;

  /** @Groups({"Concise"}) */
  private $name;

  private $books;

  ...
}

然后

use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\SerializationContext;


$serializer = SerializerBuilder::create()->build();
$context = SerializationContext::create()->setGroups(array('Concise'));
$json = $serializer->serialize($book, 'json', $context);