Zend Framework - Doctrine 2集成:存储EntityManager的位置?

Mat*_*oli 11 php doctrine zend-framework doctrine-orm

我正在整合Zend Framework和Doctrine 2.

问题是,在我的控制器和视图中,需要访问模型.我可以通过EntityManager单个实例完成所有这些操作.

我在哪里存储这个实例?

  • Zend_Registry?这就是它现在的位置,它可以从任何地方访问,但不是很实用:$em = Zend_Registry::get('EntityManager');
  • 作为控制器和视图属性?那是可以访问的$this->em,我喜欢这个
  • 创建一个将返回实例的工厂类?$em = My\EntityManager\Factory::getInstance();.封装很好,但很长时间打字......
  • EntityManager一个单身了吗?- >(更新)不是不是

Cob*_*bby 12

我不建议直接在您的控制器和视图中使用EntityManager.相反,使用服务层并注入EntityManager.

我有两个自定义操作助手,一个用于检索存储库,另一个用于服务.每个操作都包含对EntityManager的引用,并在将其返回给Controller之前将其注入.

不是我的实际代码,而是这样的(未经测试):

我的/控制器/动作/助手/ Service.php

<?php

namespace My\Controller\Action\Helper;

use Doctrine\ORM\EntityManager;

class Service extends \Zend_Controller_Action_Helper_Abstract
{

    private $em;

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

    public function direct($serviceClass)
    {
        return new $serviceClass($this->em);
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以编写类似的Action Helper来检索存储库.

然后,在您的引导程序中注册帮助程序(我们也可以访问EntityManager):

<?php

use Zend_Controller_Action_HelperBroker as HelperBroker,
    My\Controller\Action\Helper\Service;

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initActionHelpers()
    {
        $this->bootstrap('doctrine');
        $em = $this->getResource('doctrine');

        HelperBroker::addHelper(new Service($em));
    }

}
Run Code Online (Sandbox Code Playgroud)

现在写一个简单的服务.

我/域/博客/服务/ PostService.php

<?php

namespace My\Domain\Blog\Service;

use Doctrine\ORM\EntityManager,
    My\Domain\Blog\Entity\Post;

class PostService implements \My\Domain\Service
{

    private $em;

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

    public function createPost($data)
    {
        $post = new Post();
        $post->setTitle($data['title']);
        $post->setContent($data['content']);

        $this->em->persist($post);
        $this->em->flush(); // flush now so we can get Post ID

        return $post;
    }

}
Run Code Online (Sandbox Code Playgroud)

并在控制器动作中将它们组合在一起:

<?php

class Blog_PostController extends Zend_Controller_Action
{

    private $postService;

    public function init()
    {
        $this->postService = $this->_helper->Service('My\Domain\Blog\PostService');
    }

    public function createPostAction()
    {
        // normally we'd get data from the actual request
        $data = array(
            "title" => "StackOverflow is great!",
            "content" => "Imagine where I'd be without SO :)"
        );
        // and then validate it too!!

        $post = $this->postService->createPost($data);
        echo $post->getId(); // Blog post should be persisted
    }

}
Run Code Online (Sandbox Code Playgroud)