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

NBP*_*ino 5 php symfony symfony-2.3

我正在使用Symfony2.3,我目前正在使用EntityManager,如__construct()中所示

哪个是使用__construct()中的 EntityManager 或在每个方法中使用的更好的方法?如公共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();
    }
Run Code Online (Sandbox Code Playgroud)

One*_*ema 10

如果你的构造函数中必须EntityManager可用的,那么获取它的好方法是将它注入构造函数.

为此,您必须将控制器定义为服务.

# 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 ] 
Run Code Online (Sandbox Code Playgroud)

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

use Doctrine\ORM\EntityManager;

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

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

$this->getDoctrine()->getManager();
Run Code Online (Sandbox Code Playgroud)

要么

$this->container->get('doctrine')->getManager();
Run Code Online (Sandbox Code Playgroud)

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

最后,您使用的是满足您的需求.

  • 就像我说的那样:"你使用哪一个符合你的需求".如果不了解您的具体项目,很难建议您可以做什么或者其他什么.您可能需要基类或使用设计模式.我只是在代码中保持一致,所以选择一个并坚持下去:).请注意,对我来说,在构造函数中获取EM的方式引发了一些危险信号:使用`$ GLOBALS`变量为1,多个对象之间的链接方法是另一个. (2认同)