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
我想知道在 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