J'ai ces deux entités dans mon projet
class PoliceGroupe
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="code", type="string", length=50)
*/
private $code;
/**
* @ORM\ManyToMany(targetEntity="PointVente", inversedBy="policegroupe")
* @ORM\JoinTable(name="police_groupe_point_vente",
* joinColumns={@ORM\JoinColumn(name="police_groupe_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="point_vente_id", referencedColumnName="id")}
* )
*/
private $pointVente;
/**
* Constructor
*/
public function __construct($produit)
{
$this->pointVente = new \Doctrine\Common\Collections\ArrayCollection();
}
}
Et voici mon autre entité
class PointVente
{
/**
* @var string
*
* @ORM\Column(name="abb", type="string", length=50)
*/
private $abb;
/**
* @var string
*
* @ORM\Column(name="libelle", type="string", length=255)
*/
private $libelle;
/**
*
* @ORM\ManyToMany(targetEntity="PoliceGroupe", mappedBy="pointVente")
*/
private $policegroupe;
}
et j'essaie d'exécuter ce code dans mon contrôleur
$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new ObjectNormalizer());
$serializer = new Serializer($normalizers, $encoders);
$em = $this->getDoctrine()->getManager();
$data = $request->get('data');
$policegroupe=$em->getRepository('StatBundle:PoliceGroupe')->findOneBy(array('id' => $data));
$pointventes = $policegroupe->getPointVente();
$jsonContent = $serializer->serialize($pointventes, 'json');
return new JsonResponse( array('pointventes'=>$jsonContent) );
Mais je reçois cette exception
Symfony\Component\Serializer\Exception\CircularReferenceException: A circular reference has been detected (configured limit: 1).
at n/a
in C:\wamp\www\Sys\vendor\symfony\symfony\src\Symfony\Component\Serializer\Normalizer\AbstractNormalizer.php line 194
J'ai cartographié mes entités selon les annotations de la doctrine. Est-ce que je manque quelque chose?
Utilisez la méthode useCircularReferenceLimit
. Par exemple:
$normalizer = new ObjectNormalizer();
$normalizer->setCircularReferenceLimit(2);
// Add Circular reference handler
$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getId();
});
$normalizers = array($normalizer);
$serializer = new Serializer($normalizers, $encoders);
La raison en est que les références circulaires dans vos entités entraînent des problèmes lorsque vous essayez de les sérialiser. Cette méthode a pour effet de définir la profondeur maximale de la hiérarchie de sérialisation.
Edit: Ajout d'un gestionnaire de référence circulaire ( Une référence circulaire a été détectée (limite configurée: 1) Sérialiseur SYMFONY )
setCircularReferenceLimit
et setCircularReferenceHandler
sont déconseillés en faveur des clés suivantes du contexte: circular_reference_limit
et circular_reference_handler
. Donc:
$encoders = [new XmlEncoder(), new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$serializer->serialize(
$objectToSerialize,
'json',
[
'circular_reference_limit' => 2,
'circular_reference_handler' => function ($object) {
return $object->getId();
}
]
)
Correction du même problème par
use JMS\Serializer\SerializerBuilder;
...
$products = $em->getRepository('AppBundle:Product')->findAll();
$serializer = SerializerBuilder::create()->build();
$jsonObject = $serializer->serialize($products, 'json');
Lire ici