Задать вопрос

Symfony serialize при добавлении определенной связи перестает работать, почему?

Всем привет, есть 3 таблицы, user, ticket, ticket_assigned_user, у ticket есть связь с ticket_assigned_user эта связь OneToMany. Но если добавляю связь OneToMany между user и ticket_assigned_user то сериализатор уходит так что страница падает с ошибкой по таймауту. В чем именно тут проблема?
Как я сериализую

$encoders = [new XmlEncoder(), new JsonEncoder()];
        $classMetadataFactory = new ClassMetadataFactory(new XmlFileLoader('/var/www/new-sys.local/config/packages/serialization/definition.xml'));
        $defaultContext = [
            AbstractObjectNormalizer::MAX_DEPTH_HANDLER => function ($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []) {
                return $innerObject->id;
            },
            AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ($object, $format, $context) {
                return $object->getId();
            },
        ];
        $normalizers = [
            new DateTimeNormalizer(),
            new ObjectNormalizer(
                $classMetadataFactory,
                null,
                null,
                null,
                null,
                null,
                $defaultContext
            ),
        ];
        $serializer = new Serializer($normalizers, $encoders);
        $tickets = $this->em->getRepository(Ticket::class)->findBy([], null, 10);
        $jsonContent = $serializer->serialize($tickets, 'json', [
            AbstractObjectNormalizer::ENABLE_MAX_DEPTH => true,
        ]);

И может знает кто хороший пример работы api проекта на симфони с использованием symfony/serializator?
  • Вопрос задан
  • 256 просмотров
Подписаться 1 Средний 11 комментариев
Решения вопроса 1
Так как у вас не просто первый класс ссылается на второй и второй на первый, а через третью сущность, то Doctrine неверно их обрабатывает. В таком случаи стоит убрать вывод поля user.assignedTickets, как раз через упомянутый вами массив
[AbstractNormalizer::ATTRIBUTES => ['assignedUsers' => ['assignedTickets']]
, тогда структура будет плоская, но без ухода в рекурсию.

Есть где посмотреть примеры как на относительно реальных примерах работают с сериализатором этим?

Только документация, а дальше уже нужно просто продумывать все запросы. Если говорить относительно этйо задачи, я бы на вашем месте сделал просто один метод в классе репозитория билетов и в нем реализовал SQL-запрос в обход Doctrine, так как в итоге необходимо получить json, а использование ORM дает большие накладные расходы и неоптимальные пачки запросов к БД.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы