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

Symfony中JMS Serializer反序列化PHP Enum报错的解决方法

解决JMS Serializer反序列化PHP枚举报错的方案

1. 验证JMS Serializer版本

必须使用2.17.0及以上版本,enum_support特性是在这个版本才正式引入的,低版本即便配置了该参数也不会生效。

2. 修正配置文件层级

检查config/packages/jms_serializer.yaml的配置结构,enum_support和default_value_property_reader_support必须放在serializer节点下,正确配置示例:

jms_serializer:
    serializer:
        enum_support: true
        default_value_property_reader_support: true

如果配置放错了层级(比如放在metadata节点下),会导致枚举支持不生效。

3. 为枚举类配置元数据(可选,但必要时)

如果是自定义枚举或非BackedEnum类型,需要为枚举类添加序列化元数据映射:

  1. 先在全局配置中指定枚举类的元数据目录:
jms_serializer:
    metadata:
        auto_detection: true
        directories:
            AppEnum:
                namespace_prefix: "App\\Enumeration"
                path: "%kernel.project_dir%/config/serializer"
  1. 在config/serializer目录下创建对应枚举的配置文件DocumentDescribeTypeEnum.yml:
App\Enumeration\DocumentDescribeTypeEnum:
    exclusion_policy: ALL
    properties:
        name:
            expose: true
        value:
            expose: true

如果你的枚举是PHP 8.1+的BackedEnum(带字符串/整数回退值的枚举),这一步可以省略,JMS会自动处理。

4. 检查反序列化的参数格式

反序列化时必须传递枚举的回退值(比如BackedEnum的字符串/整数值),而不是枚举类的实例结构。示例:

// 正确调用(假设枚举为字符串类型)
$enum = $serializer->deserialize('"TYPE_A"', DocumentDescribeTypeEnum::class, 'json');

不要传递包含枚举属性的JSON对象,直接传递对应的值即可。

5. 清除Symfony缓存

配置修改后可能存在缓存未更新的情况,执行命令清除缓存:

php bin/console cache:clear

内容的提问来源于stack exchange,提问作者sveta600

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:24:55