使用上下文的 "circular_reference_handler" 键代替 symfony 4.2
Use the "circular_reference_handler" key of the context instead symfony 4.2
我必须序列化一个 object 我得到了非常常见的 "circular reference error"
我使用了旧的 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 开始,我得到了你在这个问题的标题中看到的异常:
use the "circular_reference_handler" key of the context instead Symfony 4.2
我在有关序列化程序的 Symfony 文档中找不到对此的任何引用。
https://symfony.com/doc/current/components/serializer.html#handling-circular-references
有谁知道如何使用这个 "key of context" 而不是旧方法?
您可以在此处查看对此配置键的引用:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler文档尚未更新以显示此配置键的用法
此配置键必须用于您的配置文件之一(例如framework.yml)以设置用于处理循环引用的服务
serializer:
circular_reference_handler: App\Service\YourCircularReferenceHandler
不幸的是,它有点隐藏在文档中,但您可以创建一个 class 而不是使用匿名函数,然后将序列化程序配置为默认使用此服务。
# config/packages/serializer.yaml
serializer:
circular_reference_handler: 'App\Serializer\MyCircularReferenceHandler'
没有指定接口。相反,class 需要是可调用的。所以在你的情况下它可能看起来像这样:
class MyCircularReferenceHandler
{
public function __invoke($object)
{
return $object->id;
}
}
或者,您可以在上下文 属性 中提供动态处理程序:
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);
}
@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
如果正确加载了配置值,您应该会在输出的相应部分下看到它们。
在 Messenger 配置中,您可以像这样调用一个对象方法:
class CircularReferenceHandler
{
public function handle($object, string $format, array $context)
{
return $object->getId();
}
}
# config/package/messenger.yaml
framework:
messenger:
serializer:
default_serializer: messenger.transport.symfony_serializer
symfony_serializer:
format: json
context: {circular_reference_handler: 'App\application\Helpers\CircularReferenceHandler::handle'}
我必须序列化一个 object 我得到了非常常见的 "circular reference error"
我使用了旧的 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 开始,我得到了你在这个问题的标题中看到的异常:
use the "circular_reference_handler" key of the context instead Symfony 4.2
我在有关序列化程序的 Symfony 文档中找不到对此的任何引用。
https://symfony.com/doc/current/components/serializer.html#handling-circular-references
有谁知道如何使用这个 "key of context" 而不是旧方法?
您可以在此处查看对此配置键的引用:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler文档尚未更新以显示此配置键的用法
此配置键必须用于您的配置文件之一(例如framework.yml)以设置用于处理循环引用的服务
serializer:
circular_reference_handler: App\Service\YourCircularReferenceHandler
不幸的是,它有点隐藏在文档中,但您可以创建一个 class 而不是使用匿名函数,然后将序列化程序配置为默认使用此服务。
# config/packages/serializer.yaml
serializer:
circular_reference_handler: 'App\Serializer\MyCircularReferenceHandler'
没有指定接口。相反,class 需要是可调用的。所以在你的情况下它可能看起来像这样:
class MyCircularReferenceHandler
{
public function __invoke($object)
{
return $object->id;
}
}
或者,您可以在上下文 属性 中提供动态处理程序:
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);
}
@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
如果正确加载了配置值,您应该会在输出的相应部分下看到它们。
在 Messenger 配置中,您可以像这样调用一个对象方法:
class CircularReferenceHandler
{
public function handle($object, string $format, array $context)
{
return $object->getId();
}
}
# config/package/messenger.yaml
framework:
messenger:
serializer:
default_serializer: messenger.transport.symfony_serializer
symfony_serializer:
format: json
context: {circular_reference_handler: 'App\application\Helpers\CircularReferenceHandler::handle'}