Symfony 5.4及更高版本中getDoctrine()方法的新替代方案是什么
AbstractController::getDoctrine() 弃用替代方案 AbstractController::getDoctrine() 自Symfony 6.2版本起正式标记为弃用,官方不再提供同类型的控制器内置快捷方法,推荐使用依赖注入获取Doctrine相关实例,具体实现方案如下:
方案1:构造函数注入(全局适用,最推荐)
直接在控制器构造函数中注入对应实例,全控制器所有方法都可以直接调用:
use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class CustomController extends AbstractController { // 注入EntityManager,替代原有getDoctrine()->getManager()的能力 public function __construct( private EntityManagerInterface $entityManager ) {} public function demoAction() { // 直接调用注入的实例操作即可 $repo = $this->entityManager->getRepository(YourEntity::class); $this->entityManager->persist($entity); $this->entityManager->flush(); } }
如果需要和原有getDoctrine()完全一致的能力,可以把注入的类型替换为Doctrine\Persistence\ManagerRegistry。
方案2:方法参数注入(适合单方法使用场景)
如果只有单个路由方法需要用到Doctrine,可以直接在方法参数中声明注入:
use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class CustomController extends AbstractController { public function demoAction(EntityManagerInterface $entityManager) { // 直接用参数$entityManager操作 $entityManager->flush(); } }
注意事项
- 不建议自行在基础控制器中重新实现
getDoctrine()快捷方法,依赖注入是Symfony官方主推的资源获取方式,可测试性和代码清晰度都更高。 - 如果需要直接操作实体仓库,也可以直接注入对应
XXXRepository类,无需通过EntityManager中转。
内容的提问来源于stack exchange,提问作者S. Dre
相关产品推荐
相关产品推荐

