You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:36:01