Saltar al contenido

Symfony 3.2 Se ha detectado una referencia circular (límite configurado: 1)

Recabamos por todo el mundo on line y así de esta manera tenerte la solución a tu dilema, si tienes preguntas déjanos tu duda y te contestamos con gusto.

Solución:

Symfony 3.2

Utilizar el setCircularReferenceLimit método. Por ejemplo:

$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 razón es que la referencia circular en sus entidades causa algunos problemas cuando intenta serializarlas. El efecto del método es definir la profundidad máxima de la jerarquía de serialización.

Editar: controlador de referencia circular agregado (se ha detectado una referencia circular (límite configurado: 1) serializador SYMFONY)

EDITAR: Actualización (Symfony 4.2)

Se probará con Symfony 3.2, pero el circular_reference_limit no es el problema aquí (y el valor predeterminado es 1 está bien, de lo contrario, su entidad se recuperará 2 veces), el problema es la forma en que la entidad es manejada por circular_reference_handler. diciendo eso id es el identificador de entidad resuelve el problema. Consulta Symfony Docs al final de este párrafo.

Ya que setCircularReferenceHandler está en desuso en favor de lo siguiente keys del contexto circular_reference_handlerpodemos escribir:

// Tip : Inject SerializerInterface $serializer in the controller method
// and avoid these 3 lines of instanciation/configuration
$encoders = [new JsonEncoder()]; // If no need for XmlEncoder
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);

// Serialize your object in Json
$jsonObject = $serializer->serialize($objectToSerialize, 'json', [
    'circular_reference_handler' => function ($object) 
        return $object->getId();
    
]);

// For instance, return a Response with encoded Json
return new Response($jsonObject, 200, ['Content-Type' => 'application/json']);

La mejor manera es usar el useCircularReferenceLimit método. Como ya se ha explicado claramente en este post.

Pero tenemos otra opción. Como opción, hay una manera de ignorar attributes del objeto origen. Podemos ignorarlo si definitivamente no lo necesitamos en un objeto serializado. La ventaja de esta solución es que el objeto serializado es más pequeño y más fácil de leer, y la desventaja es que ya no nos referiremos al objeto ignorado. attribute.

Symfony 2.3 – 4.1

Para eliminar esos attributes use el método setIgnoredAttributes() en la definición del normalizador:

use SymfonyComponentSerializerSerializer;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;

$normalizer = new ObjectNormalizer();
$normalizer->setIgnoredAttributes(array('age'));
$encoder = new JsonEncoder();

$serializer = new Serializer(array($normalizer), array($encoder));
$serializer->serialize($person, 'json'); // Output: "name":"foo","sportsperson":false

Él setIgnoredAttributes() El método se introdujo en Symfony 2.3.

Antes de Symfony 2.7, attributes solo se ignoraron durante la serialización. Desde Symfony 2.7, también se ignoran al deserializar.

Symfony 4.2 – 5.0

Él setIgnoredAttributes() El método que se usaba como alternativa a la opción ignore_attributes quedó obsoleto en Symfony 4.2.

Para eliminar esos attributes proporcionar un array mediante el ignored_attributes key en el parámetro de contexto del método serializador deseado:

use AcmePerson;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;
use SymfonyComponentSerializerSerializer;

$person = new Person();
$person->setName('foo');
$person->setAge(99);

$normalizer = new ObjectNormalizer();
$encoder = new JsonEncoder();

$serializer = new Serializer([$normalizer], [$encoder]);
$serializer->serialize($person, 'json', ['ignored_attributes' => ['age']]); // Output: "name":"foo"

En mis proyectos de Symfony 3.4 utilizo una combinación de estos dos métodos. setIgnoredAttributes() y setCircularReferenceLimit() y funciona bien

Fuente: https://symfony.com/doc/3.4/components/serializer.html

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *