Symfony使用GetSetMethodNormalizer序列化日期返回空数组如何解决
问题原因
你手动注册的GetSetMethodNormalizer优先级高于Symfony内置的DateTimeNormalizer。当序列化日期对象时,GetSetMethodNormalizer会优先处理,尝试读取DateTime对象的公开Getter方法返回的属性,而DateTime内部属性不对外暴露,最终就会生成空数组。
修复方案
有三种常用的修复方式,任选一种即可:
- 方案1:降低
GetSetMethodNormalizer的优先级,让日期序列化器优先处理
修改你的服务配置,给serializer.normalizer标签设置负优先级,保证比内置的DateTimeNormalizer后执行:
services: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer: arguments: [ '@Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface', '@serializer.name_converter.camel_case_to_snake_case' ] tags: - { name: serializer.normalizer, priority: -20 }
调整优先级后,内置的DateTimeNormalizer会先处理日期类型对象,处理完成后不会再进入GetSetMethodNormalizer逻辑。
- 方案2:配置
GetSetMethodNormalizer忽略日期类型
通过setIgnoredTypes方法设置忽略所有实现DateTimeInterface的对象,交给后续的序列化器处理:
services: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer: arguments: [ '@Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface', '@serializer.name_converter.camel_case_to_snake_case' ] tags: [serializer.normalizer] calls: - method: setIgnoredTypes arguments: - ['DateTimeInterface']
- 方案3:使用Symfony框架内置配置注册GetSetMethodNormalizer(适用于Symfony 6+版本)
无需手动注册服务,直接在packages/framework.yaml中添加如下配置即可,框架会自动处理序列化器的优先级问题:
framework: serializer: normalizers: get_set_method: true
修改完成后执行php bin/console cache:clear清空缓存,再执行序列化操作即可正常输出日期格式内容。
内容的提问来源于stack exchange,提问作者Oleksandr Savchenko
相关产品推荐
相关产品推荐

