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

问题描述 投票:1回答: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);

这项工作但作为Symfony的4.2的我让你在这个问题的标题看到的除外:

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

我无法找到关于串行器的Symfony文档中此任何引用。

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

是否有任何人知道如何使用这个“背景下的键”,而不是旧的方法是什么?

php symfony serializer symfony-4.2
2个回答
4
投票

遗憾的是,有些隐藏在这个文档中,你可以创建一个类,而不是使用匿名函数,然后配置默认使用此服务的串行器。

它是配置参考的一部分: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'

没有指定接口。相反,类必须是可调用。所以你的情况可能是这样的:

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

1
投票

你可以在这里看到这种配置的关键参考:https://symfony.com/doc/current/reference/configuration/framework.html#circular-reference-handler商务部尚未更新,以显示这个配置项的用法

这种配置的关键在你的配置文件(framework.yml例如)中的一个被用来设置用于处理循环引用服务

serializer:
    circular_reference_handler: App\Service\YourCircularReferenceHandler

1
投票

增编@ 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

如果配置值是正确加载,你会看到他们下在输出相应的部分。


0
投票

另外,您也可以提供上下文属性动态处理函数:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.