序列化多对多关联对象时,"已检测到循环引用"错误

Jon*_*han 6 serialization symfony

自从升级到Symfony 2.7以来,在尝试序列化与给定组关联的联系人数组时,我似乎一直在"检测到循环引用"错误.它们是在多对多关联中设置的(一个组有很多联系人;一个联系人有很多组关联).

现在,我遵循指南使用序列化组按照2.7升级帖子,但似乎仍然得到错误.我的控制器代码目前如下:

$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')
));
Run Code Online (Sandbox Code Playgroud)

运行时$serializer->serialize(),我在1个循环引用后得到CircularReferenceException.到目前为止,我使用@Groups注释配置了我的Contact实体,如下所示:

/**
 * 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
}
Run Code Online (Sandbox Code Playgroud)

和我的ContactGroup实体:

/**
 * ContactGroup
 *
 * @ORM\Table(name="tblContactsGroups")
 * @ORM\Entity
 */
class ContactGroup
{
    // ...

    /**
     * 
     * @var Contact
     * 
     * @ORM\ManyToMany(targetEntity="Twb\Bundle\ContactsBundle\Entity\Contact", mappedBy="contactGroups")
     */
    private $contacts;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

在这里我是否缺少一些解决循环问题的东西?非常感谢.

小智 3

看起来配置有问题。您必须启用序列化组注释:

# app/config/config.yml
framework:
# ...
serializer:
    enable_annotations: true
Run Code Online (Sandbox Code Playgroud)

并且正确的使用语句必须存在于 ContactGroup 实体类中

use Symfony\Component\Serializer\Annotation\Groups;
Run Code Online (Sandbox Code Playgroud)