Эй, всего час назад я задал вопрос о новом циклическом_референциальном_обработчике в сериализаторе 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?
Любая помощь будет принята с благодарностью
Здравствуйте, можно узнать, решили ли вы эту проблему? Я также столкнулся с той же проблемой.




Поэтому я бы просто сделал это:
<?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
Спасибо за ответ, я проверю и вернусь к вам
оказывается, функция __invoke может принимать больше аргументов ($innerObject, $outerObject, $attributeName), однако я до сих пор не знаю, что с ними делать в теле функции