【问题标题】:Symfony - set @SerializedName() dynamicallySymfony - 动态设置@SerializedName()
【发布时间】:2020-06-29 15:07:52
【问题描述】:

有没有办法访问序列化器元数据,类似于学说映射/类元数据? Doctrine 允许您通过loadClassMetadata($args)EventSubscriber 编辑映射信息。

我想编辑我的@SerializedName("foo") 注释预序列化。

对于上下文,属性(以及实体)位于 symfony 包中,需要根据主要应用程序设置重命名。

我使用的是 symfonys 序列化程序,而不是 JMS。

是否可以在注解中调用函数,如下所示:@SerializedName(getName())?这可以解决我的问题。

【问题讨论】:

    标签: php symfony serialization


    【解决方案1】:

    虽然我发现了一些对我有用的东西,但建议的解决方案并没有让我走得太远。

    use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
    use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
    use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
    use Doctrine\Common\Annotations\AnnotationReader;
    
    
    public function __construct(ClassMetadataFactoryInterface $classMetadataFactory){
       $this->classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
    }
    

    在实际序列化之前调用的我的函数中:

    $classMetadata = $this->classMetadataFactory->getMetadataFor('fully qualified classname');
    $attributesMetadata = $classMetadata->getAttributesMetadata();
    
    foreach ($attributesMetadata as $attr) {
        $attr->addGroup(['exampleGroup']);
        $attr->setSerializedName('examplename');
    }
    

    这样我可以动态更改元数据。

    【讨论】:

      【解决方案2】:

      为此类创建自定义规范器并根据需要进行更改 https://symfony.com/doc/current/serializer/custom_normalizer.html

      【讨论】:

      • 感谢您的回答,我明天会看看这个,看看这对我有多大影响。
      猜你喜欢
      • 2021-12-26
      • 2018-02-25
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多