symfony - 在 Symfony 中反序列化日期时间

标签 symfony deserialization symfony-3.3

尝试在 Symfony 3.3 中使用序列化器组件。我与具有“DateTime”成员的实体斗争。

我的 config.yml 序列化程序初始化:

serializer:
    enable_annotations: true

在 service.yml 中添加了这个:
datetime_method_normalizer:
    class: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
    public: false
    tags: [serializer.normalizer]

反序列化后的代码如下所示:
$yml = [...]   // It was created by serializer->serialize()
$serializer = $this->get('serializer');
$myObject = $serializer->deserialize($yml, MyObject::class, "yaml");

错误是:Expected argument of type "DateTime", "string" given在 vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php (第 204 行)

我认为 DateTimeNormalizer::denormalize 永远不会被调用。知道如何让它恢复生机吗?

信息:DateTimeNormalizer::__constructor() 被调用。

最佳答案

由于 DateTime 是一个嵌套对象,您应该按照此处所述使用 PropertyInfo 组件 —
https://symfony.com/doc/current/components/serializer.html#recursive-denormalization-and-type-safety

The extraction of property information is performed by extractor classes.



https://symfony.com/doc/current/components/property_info.html#extractors

有4种类型的提取器:
  • 反射提取器
  • PhpDocExtractor
  • SerializerExtractor
  • DoctrineExtractor

  • 例如,使用 ReflectionExtractor 您需要为参数或返回类型指定类型提示。它还查找构造函数参数(需要显式启用)
    class Item {
    
       protected $date;
    
       public function setDate(\DateTime $date) {...}
       public function getDate() : \DateTime {...}
    }
    

    设置选项时,属性信息会自动注册:
    # config/packages/framework.yaml 
    framework:
      property_info: ~
    

    之后你需要覆盖序列化服务来使用它,或者定义一个自定义的服务。最后一部分——添加 DateTimeNormalizer,这样 DateTime 就可以被序列化器处理了。
    app.normalizer.item_normalizer:
        class: Symfony\Component\Serializer\Normalizer\ObjectNormalizer
        arguments:
          - null
          - null
          - null
          - '@property_info.reflection_extractor'
        tags: [ 'serializer.normalizer' ]
    
    app.serializer.item:
        class: Symfony\Component\Serializer\Serializer
        public: true
        arguments:
          - [
              '@serializer.normalizer.datetime',
              '@app.normalizer.item_normalizer',
            ]
          - [ '@serializer.encoder.json' ]
    

    就是这样。

    关于symfony - 在 Symfony 中反序列化日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44759094/

    相关文章:

    symfony - 为 FOSUserBundle 中的用户手动发送密码重置电子邮件

    twig - 使用表单实体字段类型(Symfony3)在 Twig 模板中使用自定义 html 包装复选框

    php - 如何以编程方式登录/验证用户?

    xml - 如何将 xml 节点添加到 symfony Crawler()

    java - 使用 GSON 解析 Json 值,可以是 double 值或字符串

    c# XmlReader : reading attributes from start element 收藏

    Symfony 进程吞噬终端控制代码

    c# - XmlException : Document element did not appear - line 1, 位置 1

    php - Symfony 3.3 内置服务器错误

    php - Symfony 单元测试自定义事件监听器