Пользовательский обработчик циклических ссылок для сериализации - PullRequest
0 голосов
/ 10 февраля 2019

Попытка сериализации объекта, которая вызывает некоторые проблемы с циклическими ссылками

class Comment
{
    /**
     * @var Discussion
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Discussion", inversedBy="comments")
     * @ORM\JoinColumn(nullable=false)
     */
    private $discussion;
}

class Discussion
{
    /**
     * @var Comment[]|ArrayCollection
     *
     * @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="discussion")
     */
    private $comments;
}

Поскольку я использую компонент Serializer путем введения SerializerInterface, я попытался расширить свой framework.yaml с помощью:

serializer:
    circular_reference_handler: App\Utils\CircularReferenceHandler

Где класс обработчика реализует метод __invoke, который просто возвращает идентификатор объекта:

public function __invoke($object, string $format = null, array $context = [])
{
    if (method_exists($object, 'getId')) {
        return $object->getId();
    }
    return '';
}

К сожалению, это не работает, и я получаю бесконечныйцикл (превышающий доступную память).Что я делаю не так?

1 Ответ

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

Если я правильно понимаю, вы пытаетесь использовать сериализатор, и у вас возникают проблемы с отношением ManyToOne, вызывающие ошибку циклической ссылки.

Я решил эту проблему в прошлом с помощью:

$normalizer->setignoredattributes()

Это позволяет игнорировать атрибуты объекта, который вы пытаетесь сериализовать.Таким образом, вы будете только сериализовать ссылку на обсуждение вплоть до комментариев, но не ссылки на объекты комментариев обратно на обсуждение.Вы проигнорируете ссылку на объект комментариев в обсуждении.

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');

Ключ здесь:

$normalizer->setIgnoredAttributes(array('age')); 

Это просто пример из документации, которую вы можете прочитать здесь: https://symfony.com/doc/current/components/serializer.html#ignoring-attributes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...