Symfony4配置默认snake_case序列化时DateTime归一化为空数组问题
问题说明
在Symfony 4(以下简称sf4)中为Serializer组件配置默认snake_case命名转换规则时,使用了如下服务配置:
Symfony\Component\Serializer\Normalizer\ObjectNormalizer: public: true arguments: ['@serializer.mapping.class_metadata_factory', '@serializer.name_converter.camel_case_to_snake_case'] tags: [serializer.normalizer]
配置可正常生效,但出现异常:DateTime类型数据会被归一化为空数组。修改配置前DateTime类型可正常归一化为日期字符串。
故障原因
该配置的核心问题是手动覆写ObjectNormalizer服务时未指定正确的加载优先级,打乱了序列化组件内置归一化器的执行顺序:
- Symfony序列化器的归一化器按照优先级从高到低匹配执行,专门处理
DateTime类型的DateTimeNormalizer默认优先级高于处理通用对象的ObjectNormalizer,正常流程下遇到DateTime实例会优先匹配到DateTimeNormalizer,输出符合预期的日期字符串。 - 手动注册的
ObjectNormalizer未配置priority参数,默认优先级高于内置的DateTimeNormalizer,会提前拦截到DateTime对象。由于DateTime类没有公开可访问的实例属性,通用对象归一化逻辑遍历不到任何可输出的属性,最终返回空数组。
修复方法
给手动注册的ObjectNormalizer设置低于DateTimeNormalizer的优先级即可。DateTimeNormalizer默认优先级为-10,可将自定义的ObjectNormalizer优先级设为-20或更低,修改后配置如下:
Symfony\Component\Serializer\Normalizer\ObjectNormalizer: public: true arguments: ['@serializer.mapping.class_metadata_factory', '@serializer.name_converter.camel_case_to_snake_case'] tags: - { name: serializer.normalizer, priority: -20 }
补充提示:手动覆写框架内置核心服务时,除了优先级配置,还要注意构造函数的参数顺序、传值需要和框架默认定义对齐,避免漏传必要依赖引发其他异常。
内容的提问来源于stack exchange,提问作者gherkins
相关产品推荐
相关产品推荐

