使用上下文的“circular_reference_handler”键代替symfony 4.2

Den*_*est 3 php serialization symfony symfony-4.2

我必须序列化一个对象,我得到了如此常见的“循环引用错误”

我使用了旧的 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);
Run Code Online (Sandbox Code Playgroud)

这项工作但从 Symfony 4.2 开始,我得到了您在此问题标题中看到的异常:

使用上下文的“circular_reference_handler”键代替 Symfony 4.2

我在有关序列化程序的 Symfony 文档中找不到对此的任何参考。

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

有谁知道如何使用这个“上下文键”而不是旧方法?

dbr*_*ann 6

不幸的是,它在文档中有点隐藏,但是您可以创建一个类而不是使用匿名函数,然后将序列化程序配置为默认使用此服务。

它是配置参考的一部分: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'
Run Code Online (Sandbox Code Playgroud)

没有指定接口。相反,该类需要是可调用的。因此,在您的情况下,它可能如下所示:

class MyCircularReferenceHandler
{
    public function __invoke($object)
    {
        return $object->id;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @DennisdeBest 是的,您可以删除 `setCircularReferenceHandler`。配置设置处理程序,如果检测到循环引用,将自动调用该处理程序。 (2认同)