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类型,需要为枚举类添加序列化元数据映射:
- 先在全局配置中指定枚举类的元数据目录:
jms_serializer: metadata: auto_detection: true directories: AppEnum: namespace_prefix: "App\\Enumeration" path: "%kernel.project_dir%/config/serializer"
- 在
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
相关产品推荐
相关产品推荐

