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

后端 未结 3 1725
时光说笑
时光说笑 2020-12-28 17:05

I have this two entities in my project

class PoliceGroupe
{
    /**
     * @var int
     *
     * @ORM\\Column(name=\"id\", type=\"integer\")
     * @ORM\\I         


        
3条回答
  •  佛祖请我去吃肉
    2020-12-28 17:42

    The best way is to use the useCircularReferenceLimit method. As it has already been clearly explained in this post.

    But we have another option. As an option, there's a way to ignore attributes from the origin object. We can ignore it if we definitely don't need it in a serialized object. The advantage of this solution is that the serialized object is smaller and easier to read, and the disadvantage is that we will no longer refer to the ignored attribute.

    Symfony 2.3 - 4.1

    To remove those attributes use the setIgnoredAttributes() method on the normalizer definition:

    use Symfony\Component\Serializer\Serializer;
    use Symfony\Component\Serializer\Encoder\JsonEncoder;
    use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
    
    $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}
    

    The setIgnoredAttributes() method was introduced in Symfony 2.3.

    Prior to Symfony 2.7, attributes were only ignored while serializing. Since Symfony 2.7, they are ignored when deserializing too.

    Symfony 4.2 - 5.0

    The setIgnoredAttributes() method that was used as an alternative to the ignored_attributes option was deprecated in Symfony 4.2.

    To remove those attributes provide an array via the ignored_attributes key in the context parameter of the desired serializer method:

    use Acme\Person;
    use Symfony\Component\Serializer\Encoder\JsonEncoder;
    use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
    use Symfony\Component\Serializer\Serializer;
    
    $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"}
    

    In my Symfony 3.4 projects I use a mix of these two methods setIgnoredAttributes() and setCircularReferenceLimit() and it works fine.

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

提交回复
热议问题