mohamet monte
mohamet monte

Reputation: 53

Symfony 3 serializer problems

Hello I am creating an API REST on Symfony 3.1.

I have got a problem Serializing and object.

These is the error it returns to me.

A circular reference has been detected (configured limit: 1).

Stack overflow link I have read without any result.

These is the documentation which I readed for try the seialize my obtject.

Here is the code for fill $employees:

$em = $this->getDoctrine()->getManager();
$dql = " SELECT e FROM BackendBundle:Employees e 
         INNER JOIN BackendBundle:Companies c 
         WITH e.idCompany = c.idCompany 
         WHERE c.idUser = ?1";                
$query = $em->createQuery($dql);
$query->setParameter(1,$user);
$employees = $query->getResult();

I Tryied these thing:

  1. First proof

     use Symfony\Component\Serializer\Serializer;
     use Symfony\Component\Serializer\Encoder\XmlEncoder;
     use Symfony\Component\Serializer\Encoder\JsonEncoder;
    
     use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
     $encoders = array(new XmlEncoder(), new JsonEncoder());
     $normalizers = array(new ObjectNormalizer());
     $serializer = new Serializer($normalizers,$encoders);                
     $data = $serializer->serialize($employees, 'json');
    
  2. The sencond proof

In these proof I readed by default on Symfony 3 Serialzer is deseabe. For that I modified these files:

app/config/config.yml

framework:
#esi:             ~
#translator:      { fallbacks: ["%locale%"] }
secret:          "%secret%"
router:
    resource: "%kernel.root_dir%/config/routing.yml"
    strict_requirements: ~
form:            ~
csrf_protection: ~
validation:      { enable_annotations: true }
#serializer:      { enable_annotations: true }
templating:
    engines: ['twig']
default_locale:  "%locale%"
trusted_hosts:   ~
trusted_proxies: ~
session:
    # http://symfony.com/doc/current/reference/configuration/framework.html#handler-id
    handler_id:  session.handler.native_file
    save_path:   "%kernel.root_dir%/../var/sessions/%kernel.environment%"
fragments:       ~
http_method_override: true
assets: ~
serializer:
    enabled: true
    enable_annotations: true

The unic important thing on here are the last lines where I active the serializer.

app/config/servces.yml

services:    
get_set_method_normalizer:
    class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
    public: false
    tags:
        - { name: serializer.normalizer }

src/AppBundle/Controller/DefaultController.php

<?php
$serializer = $this->get('serializer');
$json = $serializer->serialize($employees,'json');

And little more proof where there is not much difference between you are reading and it.

Please if someone know how serialize an object on Symfony 3. I wat trying it all morning with the same error.

A circular reference has been detected (configured limit: 1).

Upvotes: 0

Views: 1766

Answers (2)

Hatem Sahli
Hatem Sahli

Reputation: 33

$normalizers->setCircularReferenceHandler(function ($object) {
        return $object->getId();
    });

add this bro after you make the instance of your ObjectNormalizer() . It work perfectly for me !

Upvotes: 0

LBA
LBA

Reputation: 4099

Your issue is that serializing Employees is serializing their company which again is having a reference to Employees, a perfect circular reference.

You can handle these circular references in Symfony's Serializer e.g. by catching the CircularReferenceException or by using custom callable in setCircularReferenceHandler and only serialize attributes which are not referencing back to the original entity.

See Symfony's documentation for a detailed description.

Upvotes: 1

Related Questions