自升级到Symfony 2.7以来,我似乎一直在检测到循环引用'尝试序列化与给定组关联的联系人数组时出错。他们在多对多关联中设置(一个组有很多联系人;一个联系人有很多组关联)。
现在,我按照2.7 upgrade post按照指南使用序列化组,但似乎仍然出现错误。我的控制器代码目前如下:
$group = $this->getDoctrine()
->getRepository('TwbGroupsBundle:ContactGroup')
->find($id);
$groupContacts = $group->getContacts();
$encoder = new JsonEncoder();
$normalizer = new ObjectNormalizer();
$serializer = new Serializer(array($normalizer), array($encoder));
$json = $serializer->serialize($groupContacts, 'json', array(
'groups' => array('public')
));
运行$serializer->serialize()
时,在循环引用后得到CircularReferenceException。到目前为止,我的Contact实体配置如此,使用@Groups注释:
/**
* Contact
*
* @ORM\Table(name="tblContacts")
* @ORM\Entity(repositoryClass="Twb\Bundle\ContactsBundle\Entity\Repository\ContactRepository")
*/
class Contact implements ContactInterface
{
/**
* @var string
*
* @ORM\Column(name="ContactName", type="string", length=50, nullable=true)
* @Groups({"public"})
*/
private $contactname;
/**
* @var integer
*
* @ORM\Column(name="ContactID", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
* @Groups({"public"})
*/
private $contactid;
/**
*
* @var ArrayCollection
* @ORM\ManyToMany(targetEntity="Twb\Bundle\GroupsBundle\Entity\ContactGroup", inversedBy="contacts")
* @ORM\JoinTable(name="tblContactsGroupsAssignments",
* joinColumns={@ORM\JoinColumn(name="contactId", referencedColumnName="ContactID")},
* inverseJoinColumns={@ORM\JoinColumn(name="contactGroupId", referencedColumnName="id")}
* )
*/
protected $contactGroups;
// ...getters/setters and so on
}
我的ContactGroup实体:
/**
* ContactGroup
*
* @ORM\Table(name="tblContactsGroups")
* @ORM\Entity
*/
class ContactGroup
{
// ...
/**
*
* @var Contact
*
* @ORM\ManyToMany(targetEntity="Twb\Bundle\ContactsBundle\Entity\Contact", mappedBy="contactGroups")
*/
private $contacts;
// ...
}
我是否有什么东西可以解决循环问题?非常感谢。
答案 0 :(得分:2)
配置看起来有点不对劲。 您必须启用序列化组注释:
# app/config/config.yml
framework:
# ...
serializer:
enable_annotations: true
正确的使用声明必须出现在ContactGroup实体类
中use Symfony\Component\Serializer\Annotation\Groups;
答案 1 :(得分:1)
$normalizers->setCircularReferenceHandler(function ($object) {
return $object->getId();
});
只需在创建objectNormalizer实例后添加它;