2015-10-12 12 views
5

Symfony 2.7にアップグレードして以来、関連付けられた配列の配列をシリアル化しようとすると、所与のグループ。それらは多対多の関連付けで設定されています(1つのグループには多くの連絡先があり、1つの連絡先には多くのグループ関連があります)。多対多の関連オブジェクトをシリアライズするときに「循環参照が検出されました」というエラーが発生しました

ここでは、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()を実行している、私は1つの循環参照の後CircularReferenceExceptionを取得:次のように、このための私のコントローラのコードは、現在あります。これまでのところ、私は私の連絡先エンティティは@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

http://jmsyst.com/bundles/JMSSerializerBundle – Jekis

答えて

0

設定に問題があるようです。 あなたは、シリアル化グループ注釈有効にする必要があります:

# app/config/config.yml 
framework: 
# ... 
serializer: 
    enable_annotations: true 

そして適切に使用する文は、あなたのobjectNormalizerのインスタンスを作成した後、ちょうどそれを追加

use Symfony\Component\Serializer\Annotation\Groups; 
1
$normalizers->setCircularReferenceHandler(function ($object) { 
     return $object->getId(); 
    }); 

CONTACTGROUPのエンティティクラスに存在しなければなりません。

関連する問題