web-dev-qa-db-fra.com

Symfony 3.2 Une référence circulaire a été détectée (limite configurée: 1)

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?

6
Chaymae

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 )

Mise à jour (Symfony 4.2)

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();
        }
    ]
)

Voir: https://github.com/symfony/symfony/blob/4.2/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php#L111

16

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

0
Galina Bublik