尝试在 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种类型的提取器:
例如,使用 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/