我想知道在 Symfony3 控制器上调用实体管理器是否有任何区别:
$this->getDoctrine()->getManager()
和:
$this->get('doctrine.orm.entity_manager');
表现?更正确?
提前非常感谢,卡尔·德夫
我想知道在 Symfony3 控制器上调用实体管理器是否有任何区别:
$this->getDoctrine()->getManager()
和:
$this->get('doctrine.orm.entity_manager');
表现?更正确?
提前非常感谢,卡尔·德夫
我认为两者在性能水平上是相同的,但是那些是正确的吗?我认为不,Symfony 有一个漂亮的功能称为“依赖注入”(https://symfony.com/doc/current/components/dependency_injection.html),你从来没有直接调用服务,为什么?因为很难测试,例如:
public function test()
{
$manager = $this->getDoctrine()->getManager();
$manager->persist(new MyClass());
$manager->flush();
}
如果你想测试这个调用那个方法,你必须有一个 Manager 指向某个地方,所以你的测试依赖于基础设施。
现在,想象一下:
public function test(EntityManager $manager)
{
$manager->persist(new MyClass());
$manager->flush();
}
您可以模拟该实体管理器或实现 onMemoryEntityManager 删除该依赖项。
这背后有很多理论,我建议阅读以下内容:
https://en.wikipedia.org/wiki/Dependency_injection和https://symfony.com/doc/3.3/components/dependency_injection.html
第一种方法仅在您扩展基本控制器时可用,因此通常可以在控制器中使用。这是第二种方法的捷径。
例如,当您需要将实体管理器作为类中的服务时,第二种方法很有用,并且是获取理论实体管理器的正确方法。