Symfony 实体管理器调用

Symfony Entity Manager Call

我想知道在 Symfony3 控制器上调用实体管理器是否有任何区别:

$this->getDoctrine()->getManager()

并且:

$this->get('doctrine.orm.entity_manager');

性能? 更正确?

在此先感谢您, 卡尔·德夫

第一种方法仅在扩展基础控制器时可用,因此通常可以在控制器中使用。就是第二种方法的捷径

例如,当您需要实体管理器作为 class 内的服务时,第二种方法很有用,并且是获取学说实体管理器的正确方法。

我认为两者的性能水平相同,但这些正确吗?我认为不,Symfony 有一个漂亮的功能调用 "dependency injection" (https://symfony.com/doc/current/components/dependency_injection.html),你从来没有直接调用服务,为什么?因为很难测试,例如:

    public function test()
{
     $manager = $this->getDoctrine()->getManager();
     $manager->persist(new MyClass());
     $manager->flush();
}

如果你想测试这个调用那个方法,你必须有一个管理器指向某个地方,所以你的测试取决于基础设施。

现在,想象一下:

public function test(EntityManager $manager)
    {
         $manager->persist(new MyClass());
         $manager->flush();
    }

您可以模拟该实体管理器或实现 onMemoryEntityManager 以移除该依赖项。

这背后有很多理论,我建议阅读这个:

https://en.wikipedia.org/wiki/Dependency_injection and https://symfony.com/doc/3.3/components/dependency_injection.html