Сериализатор symfony 4.2 max_depth_handler как реализовать?
Эй, всего час назад, я задал вопрос о новом циркулярном_ручке в сериализаторе symfony 4.2.
( используйте symfony 4.2 ключ "циклическая_референция_хандлера" контекста)
Ответ на этот вопрос приводит меня к новой проблеме максимального достигнутого уровня вложенности.
В документации ( https://symfony.com/doc/current/components/serializer.html)
Там нет упоминания об этом ключе контекста или как его реализовать.
Если я использую пример циркулярного_референта из моего предыдущего вопроса, я добавлю контекстный ключ в файл 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?
Любая помощь будет принята с благодарностью
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 заканчивается вызовом normalize внутри, когда вы вызываете метод serialize, но дважды проверьте его. Если это не так, возможно, вызовите метод normalize напрямую, если это решение не работает. Потому что в документации приведен пример только с нормализацией