Symfony 5.4 及更高版本中 getDoctrine() 的新替代方案

S. *_*Dre 16 php doctrine symfony symfony5

正如我的 IDE 所指出的,AbstractController::getDoctrine()方法现已被弃用。

我在官方文档和 Github 变更日志中都没有找到任何关于此弃用的参考。

此快捷方式的新替代方案或解决方法是什么?

yiv*_*ivi 37

正如这里提到的:

不要使用这些快捷方式,而是在构造函数或控制器方法中注入相关服务。

您需要使用依赖注入。

对于给定的控制器,只需注入ManagerRegistry控制器的构造函数即可。


use Doctrine\Persistence\ManagerRegistry;

class SomeController {

    public function __construct(private ManagerRegistry $doctrine) {}

    public function someAction(Request $request) {
        // access Doctrine
        $this->doctrine;
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • `ManagerRegistry` 允许您获取非默认的 `EntityManagerInterface` 管理器(如果您使用它们)。如果您只有一位管理器,则注入 EntityManagerInterface 就可以了。检查两个接口的源代码,看看有什么区别。例如,您不能直接使用“ManagerRegistry”对象来持久化或刷新。您必须通过“ManagerRegistry::getManager()”生成的对象来完成此操作。归根结底,选择哪一个并没有多大区别。选择不太冗长或更适合您的用例的一种。 (3认同)
  • 我不知道它是否“更好”。它只是相当于“getDoctrine()”的旧行为。注入 EntityManagerInterface 也可以。根据您的需求,看看哪种方法更适合您。检查每项服务提供的内容。 (2认同)

小智 5

您可以使用 EntityManagerInterface $entityManager:

public function delete(Request $request, Test $test, EntityManagerInterface $entityManager): Response
{
    if ($this->isCsrfTokenValid('delete'.$test->getId(), $request->request->get('_token'))) {
        $entityManager->remove($test);
        $entityManager->flush();
    }

    return $this->redirectToRoute('test_index', [], Response::HTTP_SEE_OTHER);
}
Run Code Online (Sandbox Code Playgroud)