'已检测到循环引用'序列化多对多关联对象时出错

时间:2015-10-12 20:55:49

标签: symfony serialization

自升级到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;

    // ...
}

我是否有什么东西可以解决循环问题?非常感谢。

2 个答案:

答案 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实例后添加它;