composer update后Doctrine getRepository调用找不到类问题
这个报错是doctrine/orm 2.12.x版本引入的行为变更导致的,和doctrine/persistence无关。
从你列出的依赖版本可以看到,升级后你安装的是doctrine/orm 2.12.2,该版本取消了对未显式配置的Bundle实体短别名的自动解析支持:旧版本会自动扫描项目内的Bundle目录,注册Bundle名:实体名格式的短别名(比如你用的AppBundle:Stadium),新版本不再自动完成这个注册流程,因此会抛出类不存在的错误。
你可以通过将doctrine/orm降级到2.11.x版本快速验证:降级后旧写法会立刻恢复正常。
另外需要说明:Bundle名:实体名的短别名写法从Doctrine ORM 2.10版本开始就已经被标记为废弃,官方一直推荐使用全限定类名的写法。
方案1(推荐,长期兼容)
将所有旧的短别名调用替换为实体类常量写法,也就是你测试通过的写法:
$this->stadiumEntity = $this->getDoctrine()->getRepository(\AppBundle\Entity\Stadium::class);
这种写法支持IDE自动补全、静态检测、代码跳转,不会受后续Doctrine版本升级的影响,是官方推荐的标准写法。
方案2(临时兼容,无需批量改代码)
如果项目内短别名写法太多,暂时不想批量修改,可以在Doctrine配置文件config/packages/doctrine.yaml中显式注册AppBundle的实体别名映射,配置示例:
doctrine: orm: mappings: AppBundle: type: annotation dir: '%kernel.project_dir%/src/AppBundle/Entity' prefix: 'AppBundle\Entity' alias: AppBundle
保存配置后执行php bin/console cache:clear清空缓存,所有旧的短别名写法就可以正常运行。
注意:该方案仅为临时兼容手段,Doctrine ORM 3.0版本会彻底移除短别名解析逻辑,项目长期迭代还是建议替换为类常量写法。
内容的提问来源于stack exchange,提问作者crmpicco

