JMS序列化报错:参数需为Doctrine\Common\Persistence\ManagerRegistry实例
错误信息
Uncaught Error: 传递给JMS\Serializer\Metadata\Driver\AbstractDoctrineTypeDriver::__construct()的参数2必须是Doctrine\Common\Persistence\ManagerRegistry实例,实际传入的是Doctrine\Bundle\DoctrineBundle\Registry实例,调用位置在/var/www/mda-api/var/cache/prod/ContainerXJGxuAr/getJmsSerializer_MetadataDriverService.php第13行
问题代码
$result = $this->serializer->deserialize( $encoder->encode($jsonContent,'json'), Client::class, "json", );
核心原因
接口依赖版本不兼容
JMS Serializer的AbstractDoctrineTypeDriver类构造函数要求传入Doctrine\Common\Persistence\ManagerRegistry接口实例,但你的项目中注入的Doctrine\Bundle\DoctrineBundle\Registry类,在新版本Doctrine中已经不再实现这个旧接口。Doctrine命名空间变更
随着Doctrine生态更新,Doctrine\Common\Persistence组件被废弃,相关接口迁移到Doctrine\Persistence命名空间下。当前你的Doctrine Bundle版本的Registry类实现的是新的Doctrine\Persistence\ManagerRegistry接口,和JMS Serializer依赖的旧接口不匹配。JMS Serializer版本未适配
你使用的JMS Serializer版本没有同步适配Doctrine的这次命名空间变更,仍然依赖旧的接口定义,导致容器注入时出现类型不匹配错误。
内容的提问来源于stack exchange,提问作者Malek Massoudi

