Как реализовать сериализатор symfony 4.2 max_depth_handler?

Эй, всего час назад я задал вопрос о новом циклическом_референциальном_обработчике в сериализаторе Symfony 4.2.

(используйте ключ контекста "circular_reference_handler" вместо symfony 4.2)

Ответ на этот вопрос приводит меня к новой проблеме достижения максимального уровня вложенности.

В документации (https://symfony.com/doc/current/components/serializer.html#handling-serialization-depth)

Нет упоминания об этом ключе контекста или о том, как его реализовать.

Если я использую пример circle_reference_handler из моего предыдущего вопроса, я добавлю ключ контекста в файл framework.yaml в разделе:

framework:
  serializer:
    max_depth_handler: 'App\Serializer\MyMaxDepthHandler'

И создайте класс

namespace App\Serializer;


class MyMaxDepthHandler
    {
    public function __invoke($object){
        //TODO how to handle this
    }
}

И для того, чтобы сериализатор использовал этот обработчик, я задаю контекст для функции сериализации:

$this->serializer->serialize($object, 'json', ['enable_max_depth' => true]);

Теперь мой вопрос, как мне справиться с этим? У кого-нибудь есть пример того, что нужно поместить в тело этой функции __invoke?

Любая помощь будет принята с благодарностью

оказывается, функция __invoke может принимать больше аргументов ($innerObject, $outerObject, $attributeName), однако я до сих пор не знаю, что с ними делать в теле функции

Dennis de Best 12.02.2019 10:57

Здравствуйте, можно узнать, решили ли вы эту проблему? Я также столкнулся с той же проблемой.

yifei3212 22.05.2019 07:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
3
2
2 461
1

Ответы 1

Поэтому я бы просто сделал это:

<?php

use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

$this->serializer->serialize($object, 'json', [ObjectNormalizer::ENABLE_MAX_DEPTH => true, ObjectNormalizer::MAX_DEPTH_HANDLER => new MyMaxDepthHandler()]);

Что касается кода внутри __invoke, вы можете вернуть любые данные, которые вам нужны на самом деле. Например, просто верните идентификатор связанного объекта. Полезно в некоторых случаях для вывода json И вам нужно обновить свой метод __invoke следующим образом:

<?php

namespace App\Serializer;

class MyMaxDepthHandler
{
    public function __invoke($innerObject, $outerObject, string $attributeName, string $format = null, array $context = []){
        return $innerObject->id;
    }
}

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

Я предполагаю, что Serializer завершается вызовом нормализовать внутри, когда вы вызываете метод сериализовать, но дважды проверьте его. Если это не так, возможно, вызовите метод нормализовать напрямую, если это решение не работает. Поскольку в документации приведен пример только с нормализовать

Только что обновил свой ответ, я не заметил, что вам нужна дополнительная информация о том, как реализовать метод __invoke

fgamess 12.02.2019 15:01

Спасибо за ответ, я проверю и вернусь к вам

Dennis de Best 12.02.2019 15:16

Другие вопросы по теме