вместо ключа symfony 4.2 используйте ключ «round_reference_handler» контекста - PullRequest
0 голосов
/ 12 февраля 2019

Так что мне нужно сериализовать объект, и я получаю очень распространенную «ошибку круговой ссылки»

Я использовал старый метод Symfony:

$normalizer = new ObjectNormalizer();
// Add Circular reference handler
$normalizer->setCircularReferenceHandler(function ($object) {
    return $object->getId();
});
$normalizers = array($normalizer);
$encoders = [new JsonEncoder()];
$serializer = new Serializer($normalizers, $encoders);

Эта работа, но наsymfony 4.2 Я получаю исключение, которое вы видите в заголовке этого вопроса:

вместо ключа используйте ключ «циклическая_референция_хандлера» symfony 4.2

Я не могу найти никакой ссылкиоб этом в документации Symfony относительно серилизатора

https://symfony.com/doc/current/components/serializer.html#handling-circular-references

Кто-нибудь знает, как использовать этот «ключ контекста» вместо старого метода?

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

Ответы [ 3 ]

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

К сожалению, он немного скрыт в документах, но вы можете создать класс вместо использования анонимной функции, а затем настроить сериализатор на использование этой службы по умолчанию.

Это часть конфигурацииссылка: https://symfony.com/doc/current/reference/configuration/framework.html#reference-serializer-circular-reference-handler

# config/packages/serializer.yaml

serializer:
    circular_reference_handler: 'App\Serializer\MyCircularReferenceHandler'

Не указан интерфейс.Вместо этого класс должен быть вызываемым.Так что в вашем случае это может выглядеть так:

class MyCircularReferenceHandler
{
    public function __invoke($object)
    {
        return $object->id;
    }
}
0 голосов
/ 22 июля 2019

Кроме того, вы можете предоставить динамический обработчик в свойстве контекста:

public function normalize($user, $format = null, array $context = [])
{
    // Handle circular references
    // DEPRECATED in sf 4.2 : 
    // $this->normalizer->setCircularReferenceHandler(function ($object) {return $object->getId();});

    // Good way in sf > 4.2
    $context['circular_reference_handler'] = function ($object) {return $object->getId();};
    // Return data
    $data = $this->normalizer->normalize($user, $format, $context);
}
0 голосов
/ 12 февраля 2019

вы можете увидеть ссылку на этот ключ конфигурации здесь: https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler документ не был обновлен, чтобы показать использование этого ключа конфигурации

этот ключ конфигурации должен использоваться в одном из вашихфайлы конфигурации (например, framework.yml) для установки службы, используемой для обработки циклических ссылок

serializer:
    circular_reference_handler: App\Service\YourCircularReferenceHandler
...