Symfony getManager导致错误,getEntityManager工作正常吗?

Symfony getManager导致错误,getEntityManager工作正常吗?,symfony,doctrine,repository,Symfony,Doctrine,Repository,作为Symfony2&doctrine的新手,我(在一个自定义存储库类中)正在努力解决getEntityManager()和getManager()之间的差异 我知道getEntityManager()正在被弃用,但是如果我改用getManager(),我会得到“未定义的方法'getManager'。方法名称必须以findBy或findOneBy开头!” 在我的课堂上,以下代码起作用: public function haalidop($verbid) { return $this-&g

作为Symfony2&doctrine的新手,我(在一个自定义存储库类中)正在努力解决
getEntityManager()
getManager()
之间的差异

我知道
getEntityManager()
正在被弃用,但是如果我改用
getManager()
,我会得到“未定义的方法'getManager'。方法名称必须以findBy或findOneBy开头!”

在我的课堂上,以下代码起作用:

public function haalidop($verbid)
{
    return $this->getEntityManager()
                ->createQuery('SELECT p FROM myBundle:Verbs p WHERE p.verbid='.$verbid)
                ->getSingleResult();
}
如果我改变(升级?)它像下面的代码,我得到的错误

public function haalidop($verbid)
    {
        return $this->getManager()
                    ->createQuery('SELECT p FROM myBundle:Verbs p WHERE p.verbid='.$verbid)
                    ->getSingleResult();
    }
有人建议这里出了什么问题吗?

如果在控制器中:

$this->get('doctrine')->getManager();
如果在服务中:

$this->container->get('doctrine')->getManager();

注册表的
getEntityManager
方法已被弃用。因为您在存储库中,所以扩展的不是注册表而是
EntityRepository
。该类只有一个
getEntityManager
方法,该方法未被弃用

这种不一致性的原因很简单:注册表也是用于其他条令库的,比如它们的ODM。它们不使用名称“实体”,而是“文档”。因此,使用
getEntityManager
对ODM没有多大意义,这就是为什么它们会更改为
getManager


另一方面,
EntityRepository
——正如它的名字已经告诉我们的那样——是ORM特定的,这意味着ODM用户不会感到困惑(他们使用另一个存储库类)。
getEntityManager
方法在存储库中仍然有效,正如您在。但在控制器中不推荐使用它,应该改用
getManager
方法。

请不要提倡在服务中注入容器,只在服务中注入您需要的服务。@WouterJ,注入容器的成本到底有多高?这与时间无关,与体系结构有关。注入容器使依赖注入无效。事实上,它被称为服务定位器反模式。试着用谷歌搜索一下,你会发现很多解释为什么你应该避免这种模式。很好的解释。我终于明白了。好的,很好的评论,谢谢!也许可以在Symfony2调试工具栏上对此进行改进。如果您使用getEntityManager(),它总是说:“不推荐使用-getEntityManager从Symfony 2.1开始就不推荐使用。使用getManager代替“@PBR”你确定调试工具栏所说的就是这段代码吗?只有在触发E#u USER#u DEPRECATED错误时,才会捕捉到这些弃用。存储库#getEntityManager方法并非如此。是的@WouterJ,你说得对,这确实是为另一段代码触发的。所以,Symfony没问题。对不起:-)真相存在于现实中