Как удалить устаревшее сообщение для обработчика циклических ссылок (Symfony 4)? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь удалить это сообщение об ошибке:

Пользователь устарел: "Symfony \ Component \ Serializer \ Normalizer \ AbstractNormalizer :: setCircularReferenceHandler ()" Начиная с Symfony 4.2 этот метод устарел, используйте Вместо этого используется ключ контекста «циркулярная ссылка».

Вот мой код:

 $encoder = new JsonEncoder();
    $normalizer = new ObjectNormalizer();
    $normalizer->setCircularReferenceHandler(function ($object, string $format = null, array $context = []) {
        return $object->getName();
    });

Я сделал обновление композитора и очистил кеш. Но ничего не помогает.

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Сообщение об ошибке говорит о том, что вы должны указать его в массиве defaultContext, который вы можете указать в качестве третьего параметра в конструкторе.

public function __construct(ClassMetadataFactoryInterface 
$classMetadataFactory = null, NameConverterInterface $nameConverter = null, array $defaultContext = array())

в вашем случае это будет:

$encoders = array(new JsonEncoder());
$normalizer = new JsonSerializableNormalizer(null,null,array(JsonSerializableNormalizer::CIRCULAR_REFERENCE_HANDLER=>function ($object) {
    return (string)$object;
}));

EDIT:
Я использовал JsonSerializableNormalizer, а вы ObjectNormalizer, тогда определение конструктора:

public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null, array $defaultContext = array())

и используется в вашей программе это должно быть:

$normalizer = new ObjectNormalizer(null,null,null,null,null,null,array(ObjectNormalizer::CIRCULAR_REFERENCE_HANDLER=>function ($object) {
    return (string)$object;
}));
0 голосов
/ 23 января 2019

Вы должны использовать его (circular_reference_handler) в качестве ключа конфигурации. Например,

serializer:
    circular_reference_handler: App\Service\YourHandlerService

Я попробовал это в framework.yaml, и оно работает.

...