Php Symfony2.3将EntityManager放入控制器的更好方法

Php Symfony2.3将EntityManager放入控制器的更好方法,php,symfony,symfony-2.3,Php,Symfony,Symfony 2.3,我使用的是Symfony2.3,目前我使用的是EntityManager,如\uu construct() 使用\u construct()中的EntityManager或在每个方法内部使用哪个方法更好?如公共索引()所示 /** *夸兹巴控制器。 * */ 类QuazBarController扩展控制器 { 公共函数构造() { $this->em=$GLOBALS['kernel']->getContainer()->get('doctrine')->getManager(); } /**

我使用的是
Symfony2.3
,目前我使用的是EntityManager,如\uu construct()

使用\u construct()中的EntityManager或在每个方法内部使用哪个方法更好?如公共索引()所示

/**
*夸兹巴控制器。
*
*/
类QuazBarController扩展控制器
{
公共函数构造()
{
$this->em=$GLOBALS['kernel']->getContainer()->get('doctrine')->getManager();
}
/**
*列出所有QuazBar实体。
*
*/
公共函数索引(请求$Request)
{
$session=$request->getSession();
$pagina=$request->query->get('page',1);
$em=$this->getDoctrine()->getManager();
}

在symfony 2.3中,我认为与条令实体管理器的连接内置在控制器类中

$em = $this->getDoctrine()->getManager();
最佳做法是在需要时在控制器中进行此调用。如果只是方便起见,您可以派生一个控制器类,并添加一些类似getEm()的内容(如果您觉得太讨厌的话)

通常,您自己的控制器类是一个好主意,用于在安全限制中烘焙,并使代码更加干燥。

如果您必须在构造函数中提供
EntityManager
,一个获得它的好方法是将其注入构造函数

要做到这一点,您必须定义您的

现在,您只需修改控制器即可:

use Doctrine\ORM\EntityManager;

/**
 * QuazBar controller.
 *
 */
class QuazBarController extends Controller
{

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
    // ...
}
$this->getDoctrine()->getManager();
如果不需要构造函数中的
实体管理器
,只需使用控制器中任何方法的依赖项注入容器即可获得:

use Doctrine\ORM\EntityManager;

/**
 * QuazBar controller.
 *
 */
class QuazBarController extends Controller
{

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
    // ...
}
$this->getDoctrine()->getManager();

控制器/设置器注入是一个不错的选择,因为您没有将控制器实现耦合到DI容器。


最后,您使用哪一个满足您的需要。

我们可以在控制器类中定义一个构造函数吗?条令是一种服务。在构造函数中获取条令或从di中获取任何您想要的内容是否有任何区别。两种方式都可以获得相同的服务。为什么要注入已经注入的em。

谢谢,但如果我有许多控制器(50~),将所有控制器都作为一项服务是不是一个好主意?就像我说的:“您使用哪一个满足您的需要?”。如果不了解具体项目的更多信息,则很难建议您如何执行或执行其他操作。您可能需要一个基类或使用设计模式。我只是希望代码保持一致,所以选择一个并坚持执行:)。请注意,对于我来说,在构造函数中获取EM的方式会引起一些危险:使用
 $GLOBALS
变量是一个,多个对象之间的方法链接是另一个。