我有序列化一个对象,我得到的曾经如此常见的“循环引用错误”
我已经使用了旧的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
是否有任何人知道如何使用这个“背景下的键”,而不是旧的方法是什么?
遗憾的是,有些隐藏在这个文档中,你可以创建一个类,而不是使用匿名函数,然后配置默认使用此服务的串行器。
# config/packages/serializer.yaml
serializer:
circular_reference_handler: 'App\Serializer\MyCircularReferenceHandler'
没有指定接口。相反,类必须是可调用。所以你的情况可能是这样的:
class MyCircularReferenceHandler
{
public function __invoke($object)
{
return $object->id;
}
}
你可以在这里看到这种配置的关键参考:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler商务部尚未更新,以显示这个配置项的用法
这种配置的关键在你的配置文件(framework.yml例如)中的一个被用来设置用于处理循环引用服务
serializer:
circular_reference_handler: App\Service\YourCircularReferenceHandler
增编@ dbrumann的回答,这对我来说非常近的工作。在我的Symfony 4.3的应用程序中,YAML的serializer
段,需要家长framework
容器。所以:
# config/packages/serializer.yaml
framework:
serializer:
circular_reference_handler: 'App\Serializer\MyCircularReferenceHandler'
然后在参考处理程序:
class MyCircularReferenceHandler {
public function __invoke($object) {
return $object->id;
}
}
要检查的配置值被正确加载,你可以利用的Symfony控制台:
$ php bin/console debug:config framework
如果配置值是正确加载,你会看到他们下在输出相应的部分。
另外,您也可以提供上下文属性动态处理函数:
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);
}