gpt4 book ai didi

rest - Symfony序列化器-设置循环引用全局

转载 作者:行者123 更新时间:2023-12-04 03:14:58 24 4
gpt4 key购买 nike

是否可以通过任何配置或类似方法在Symfony的序列化器组件(不是JMSSerializer)中设置循环引用限制?

我有一个带有FOSRestBundle的REST应用程序和一些包含其他也应该序列化的实体的实体。但是我遇到了循环引用错误。

我知道如何将其设置为:

$encoder    = new JsonEncoder();
$normalizer = new ObjectNormalizer();

$normalizer->setCircularReferenceHandler(function ($object) {
return $object->getName();
});

但这必须在多个 Controller 中完成(对我来说是开销)。
我想在配置(.yml)中全局设置它像这样:
framework: 
serializer:
enabled: true
circular_limit: 5

找不到针对此的序列化器API引用,所以我想知道是否可能吗?

最佳答案

我发现的唯一方法是创建自己的对象规范化器以添加循环引用处理程序。

最小的工作方式可以是:

<?php

namespace AppBundle\Serializer\Normalizer;

use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
use Symfony\Component\PropertyInfo\PropertyTypeExtractorInterface;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;

class AppObjectNormalizer extends ObjectNormalizer
{
public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null)
{
parent::__construct($classMetadataFactory, $nameConverter, $propertyAccessor, $propertyTypeExtractor);

$this->setCircularReferenceHandler(function ($object) {
return $object->getName();
});
}
}

然后将优先级声明为比默认优先级(-1000)高的服务:
<service
id="app.serializer.normalizer.object"
class="AppBundle\Serializer\Normalizer\AppObjectNormalizer"
public="false"
parent="serializer.normalizer.object">

<tag name="serializer.normalizer" priority="-500" />
</service>

默认情况下,项目中的任何地方都将使用此规范化器。

关于rest - Symfony序列化器-设置循环引用全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35365141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com