在FOSRestBundle中返回一个json编码的非递归对象

时间:2014-07-09 12:21:46

标签: json symfony fosrestbundle

我正在使用FOSRestBundle构建REST API。 我的实体有很多OneToMany / ManyToOne双向关系。 每当我想GET某个具有JSON格式的实体时,例如 web/app_dev.php/users/1.json我得到的对象比实际需要的要大得多:所有相关对象都是递归包含的。我的控制器返回对象并具有@View注释。

如何返回仅反映数据库行的对象(仅包含与我相关的对象的ID)?

1 个答案:

答案 0 :(得分:0)

您可以使用注释(http://jmsyst.com/libs/serializer/master/reference/annotations:参见群组,曝光/排除或MaxDepth)

我更喜欢使用群组注释(我正是我想要的!)

例如:

在Entity类中:

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 * @JMS\Groups({"main"})
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="DocumentUnique", inversedBy="Evaluations")
 * @ORM\JoinColumn(name="documentUniqueId", referencedColumnName="id")
 * @JMS\Groups({"show", "all"}) 
 */
protected $DocumentUnique;    

/**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=20)
 * @JMS\Groups({"main","all"}) 
 */
 private $title;

在控制器中:

/**
 * @Rest\View(serializerGroups={"main"})
 */    
public function cgetAction()
{
    return $this->getRepository('MyEntity')->findAll();
}

如果要显示一个关系的id,可以使用VirtualProperty注释:

/**
 * @JMS\VirtualProperty
 * @JMS\SerializedName("documentUniqueId")
 * @JMS\Groups("main") 
 */    
public function getDocumentUniqueId() {
    if (!$this->DocumentUnique) return null;
    return $this->DocumentUnique->getId();
}