сериализатор symfony 4.2 max_depth_handler как реализовать? - PullRequest
0 голосов
/ 12 февраля 2019

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

( вместо ключа symfony 4.2 используется ключ контекста "циркулярная_референция_ручки")1005 *

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

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

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

Если я использую пример циркулярного обработчика моего предыдущего вопроса, я добавлю контекстный ключ в файл 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 Ответ

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

Итак, я бы просто сделал это:

<?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 напрямую, если это решение не работает.Поскольку документация предоставляет пример только с normalize

...