Ссылка на Symfony Circular - PullRequest
       20

Ссылка на Symfony Circular

0 голосов
/ 11 февраля 2019

У меня есть следующие настройки

Entity/User
---------------
 /**
  * @ORM\ManyToMany(targetEntity="App\Entity\UserGroup", mappedBy="users")
  */
  private $userGroups;


Entity/UserGroup
    ---------------
 /**
  * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="userGroups")
  */
  private $users;

, как вы можете видеть, у меня manyTomany двунаправленное отношение,

  • пользователь принадлежит к нескольким группам
  • aВ группе может быть несколько пользователей

, когда я сериализирую связь (для обслуживания запроса API),

Я получаю глубоко вложенный объект json

$groups = $this->entityManager
     ->getRepository(UserGroup::class)
     ->findAll();
$normalizer = new ObjectNormalizer();
$normalizer->setCircularReferenceLimit(1);

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

$encoder = new JsonEncoder();
$serializer = new Serializer(array($normalizer), array($encoder));

$groups = $serializer->serialize($groups, 'json');
return View::create(json_decode($groups, true), Response::HTTP_OK);

output

Как это исправить?

1 Ответ

0 голосов
/ 11 февраля 2019

Вы можете попытаться использовать аннотацию @Groups(), чтобы указать, какие свойства ваших объектов вы хотите сериализовать в зависимости от контекста.

https://symfony.com/doc/current/components/serializer.html#attributes-groups

Поэтому, когда вы сериализуете свой объектпередайте массив с группами

$groups = $serializer->serialize($groups, 'json', ['groups' => 'user_groups.index']);

И в вашей сущности вы добавите группу в свойства, которые вы хотите включить

 Entity/UserGroup
 ---------------
 /**
  * @ORM\ManyToMany(targetEntity="App\Entity\User", inversedBy="userGroups")
  * @Groups({"user_groups.index"})
  */
  private $users;
...