php 使用上下文的“circular_reference_handler”键而不是symfony 4.2

lyfkaqu1  于 2022-12-10  发布在  PHP
关注(0)|答案(5)|浏览(125)

我必须序列化一个对象,但却遇到了常见的“循环引用错误”
我使用了古老的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
有人知道如何使用这个“上下文的关键”而不是旧的方法吗?

ndasle7k

ndasle7k1#

不幸的是,它在文档中有点隐藏,但是您可以创建一个类而不是使用匿名函数,然后配置序列化程序默认使用此服务。
它是配置参考的一部分:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler

# config/packages/serializer.yaml

serializer:
    circular_reference_handler: 'App\Serializer\MyCircularReferenceHandler'

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

class MyCircularReferenceHandler
{
    public function __invoke($object)
    {
        return $object->id;
    }
}
eulz3vhy

eulz3vhy2#

这是@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

如果正确加载了配置值,则应该在输出中的相应部分下看到它们。

6jygbczu

6jygbczu3#

您可以在以下位置看到对该配置项引用:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler,文档尚未更新以显示此配置密钥的用法
必须在配置文件之一(例如framework.yml)中使用此配置键来设置用于处理循环引用的服务

serializer:
    circular_reference_handler: App\Service\YourCircularReferenceHandler
vq8itlhq

vq8itlhq4#

或者,您可以在context属性中提供动态行程常式:

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);
}
rhfm7lfc

rhfm7lfc5#

在信使配置中,您可以调用如下对象方法:
第一个

相关问题