Symfony2.3在Controller中获取EntityManager的更好方法

时间:2014-03-03 18:36:30

标签: php symfony symfony-2.3

我正在使用Symfony2.3我正在使用EntityManager,如 __ construct()

中所示

使用来自 __ construct()的EntityManager或在每个方法中使用它是更好的方法吗?如 public indexAction()

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

    public function __construct()
    {
        $this->em = $GLOBALS['kernel']->getContainer()->get('doctrine')->getManager();
    }

    /**
     * Lists all QuazBar entities.
     *
     */
    public function indexAction(Request $request)
    {
        $session    = $request->getSession();
        $pagina     = $request->query->get('page', 1);
        $em         = $this->getDoctrine()->getManager();
    }

3 个答案:

答案 0 :(得分:10)

如果必须在构造函数中有EntityManager,那么获取它的好方法是将它注入构造函数。

为此,您必须定义controller as a service

# src/Acme/DemoBundle/Resources/config/services.yml
parameters:
    # ...
    acme.controller.quazbar.class: Acme\DemoBundle\Controller\QuazBarController

services:
    acme.quazbar.controller:
        class: "%acme.controller.quazbar.class%"
    # inject doctrine to the constructor as an argument
    arguments: [ @doctrine.orm.entity_manager ] 

现在你要做的就是修改你的控制器:

use Doctrine\ORM\EntityManager;

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

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

如果构造函数中不需要Entity Manager,则可以使用控制器中任何方法的依赖注入容器来获取它:

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

OR

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

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

最后,您使用的是符合您需求的。

答案 1 :(得分:0)

在symfony 2.3中,我认为与doctrine实体管理器的连接已构建到控制器类中。

$em = $this->getDoctrine()->getManager();

最佳做法是在需要时在控制器中进行此调用。如果它只是方便,你可以派生一个控制器类,并添加像getEm(),如果你觉得太可恶。

通常,您自己的控制器类是一个好主意,因为它会限制安全性并使您的代码更加干燥。

答案 2 :(得分:0)

我们可以在控制器类中定义构造函数吗?该学说是一项服务。在构造函数中获取学说或者在任何想要的地方获取它都是有意义的。两种方式都可以获得相同的服务。为什么要注入已经注入的em。