Symfony 3.4服务注入Doctrine Repository遇类不存在异常如何解决?
解决Symfony 3.4中注入Repository时的EntityManager代理类不存在异常
先别急,我之前在Symfony 3.4里配置自定义Repository注入的时候也踩过这个一模一样的坑,给你几个实用的排查和解决步骤:
1. 检查自定义Repository的服务配置是否正确
这个错误很大概率是因为你没正确配置Repository服务的工厂方法,Symfony没法正确生成EntityManager的代理类。正确的服务配置应该是这样的(以YAML为例):
services: acme.custom_repository: class: AppBundle\Repository\CustomRepository # 你的Repository全限定类名 factory: ['@doctrine.orm.entity_manager', 'getRepository'] arguments: - AppBundle\Entity\YourValidEntity # 你确认过的有效实体类全限定名
重点注意:factory参数是数组格式,第一个元素是EntityManager的服务ID(@doctrine.orm.entity_manager),第二个是调用的方法名getRepository,不要直接写EntityManager的代理类名,Symfony会自动处理代理类的生成。
2. 强制清理并预热缓存
那个长串的EntityManager5aa02de170f88_546a8d27f194334ee012bfe64f629947b07e4919__CG__\Doctrine\ORM\EntityManager是Symfony生成的代理类,缓存损坏或者过期就会导致找不到它。执行以下命令清理缓存:
# 开发环境 php bin/console cache:clear # 生产环境 php bin/console cache:clear --env=prod php bin/console cache:warmup --env=prod
清理完缓存后再试试,很多时候这个操作就能解决问题。
3. 确认Repository类和实体类的关联配置
- 确保你的自定义Repository类正确继承了Doctrine的
EntityRepository:
namespace AppBundle\Repository; use Doctrine\ORM\EntityRepository; class CustomRepository extends EntityRepository { // 你的自定义查询方法 }
- 同时在实体类上通过注解指定对应的Repository:
namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="AppBundle\Repository\CustomRepository") */ class YourValidEntity { // 实体字段和配置 }
虽然你说实体类是有效的,但确认一下这个关联配置没写错也很有必要。
4. 检查服务容器是否有其他编译错误
有时候其他服务的配置错误会间接导致EntityManager代理类生成失败,你可以用以下命令检查服务状态:
# 查看你的自定义Repository服务详情 php bin/console debug:container acme.custom_repository # 查看所有服务(包括私有服务) php bin/console container:debug --show-private
如果输出里有其他错误提示,先解决那些问题,再回来验证Repository的注入。
按照这几个步骤排查下来,基本就能解决这个异常了。
内容的提问来源于stack exchange,提问作者Brucie Alpha
相关产品推荐
相关产品推荐

