我必须序列化一个对象,但却遇到了常见的“循环引用错误”
我使用了古老的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我得到了例外,你看到在这个问题的标题:
使用上下文的“circular_reference_handler”键,而不是Symfony 4.2
我在Symfony文档中找不到任何关于串行化程序的参考。
https://symfony.com/doc/current/components/serializer.html#handling-circular-references
有人知道如何使用这个“上下文的关键”而不是旧的方法吗?
5条答案
按热度按时间ndasle7k1#
不幸的是,它在文档中有点隐藏,但是您可以创建一个类而不是使用匿名函数,然后配置序列化程序默认使用此服务。
它是配置参考的一部分:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler
没有指定接口。相反,类需要是可调用的。因此,在您的情况下,它可能如下所示:
eulz3vhy2#
这是@dbrumann的答案的补充,我几乎成功了。在我的Symfony 4.3应用程序中,YAML的
serializer
部分需要一个父framework
容器。因此:然后在引用处理程序中:
要检查是否正确加载了配置值,您可以使用Symfony控制台:
如果正确加载了配置值,则应该在输出中的相应部分下看到它们。
6jygbczu3#
您可以在以下位置看到对该配置项引用:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler,文档尚未更新以显示此配置密钥的用法
必须在配置文件之一(例如framework.yml)中使用此配置键来设置用于处理循环引用的服务
vq8itlhq4#
或者,您可以在context属性中提供动态行程常式:
rhfm7lfc5#
在信使配置中,您可以调用如下对象方法:
第一个