0

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

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

和:

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

表现?更正确?

提前非常感谢,卡尔·德夫

4

2 回答 2

2

我认为两者在性能水平上是相同的,但是那些是正确的吗?我认为不,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_injectionhttps://symfony.com/doc/3.3/components/dependency_injection.html

于 2018-04-05T16:12:06.350 回答
0

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

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

于 2018-04-05T15:56:44.100 回答