Мне просто нужно было решить ту же проблему: json-кодирование объекта («Пользователь»), имеющего двунаправленную ассоциацию «один ко многим» с другим объектом («Местоположение»).
Я перепробовал несколько вещей и теперь думаю, что нашел лучшее приемлемое решение. Идея заключалась в том, чтобы использовать тот же код, который был написан Дэвидом, но каким-то образом перехватить бесконечную рекурсию, сказав нормализатору остановиться в какой-то момент.
Я не хотел реализовывать пользовательский нормализатор, так как этот GetSetMethodNormalizer, на мой взгляд, является хорошим подходом (основанным на рефлексии и т. Д.). Поэтому я решил создать его подкласс, что на первый взгляд не тривиально, поскольку метод, позволяющий указать, следует ли включать свойство (isGetMethod), является закрытым.
Но можно переопределить метод нормализации, поэтому я перехватил на этом этапе, просто сбросив свойство, которое ссылается на «Местоположение» - так что бесконечный цикл прерывается.
В коде это выглядит так:
class GetSetMethodNormalizer extends \Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer {
public function normalize($object, $format = null)
{
// if the object is a User, unset location for normalization, without touching the original object
if($object instanceof \Leonex\MoveBundle\Entity\User) {
$object = clone $object;
$object->setLocations(new \Doctrine\Common\Collections\ArrayCollection());
}
return parent::normalize($object, $format);
}
}