2

能够使用 Doctrine 加速了很多事情,但是让我不得不在我的所有控制器中设置/使用实体管理器感觉有点笨拙。我希望将所有数据库逻辑放在 1 个特定模块中。也许我只是想错了方向,有人可以指出我正确的方向。

目前我有我的实体,它的功能很好,我可以通过以下方式很好地插入数据库

namespace Manage\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;


class ViewController extends AbstractActionController {
    public function somethingAction(){
        $objectManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        $user = new \Manage\Entity\User();
        $user->setname('foo');
        $user->settitle('bar');        
        $objectManager->persist($user);
        $objectManager->flush();
    }
}

但是,每当我想从数据库中选择一些东西时,我必须确保添加

 use Doctrine\ORM\EntityManager;

然后是以下控制器功能列表...

/**
 * @var EntityManager
 */
protected $entityManager;

/**
 * Sets the EntityManager
 *
 * @param EntityManager $em
 * @access protected
 * @return PostController
 */
protected function setEntityManager(EntityManager $em) {
    $this->entityManager = $em;
    return $this;
}

/**
 * Returns the EntityManager
 *
 * Fetches the EntityManager from ServiceLocator if it has not been initiated
 * and then returns it
 *
 * @access protected
 * @return EntityManager
 */
protected function getEntityManager() {
    if (null === $this->entityManager) {
        $this->setEntityManager($this->getServiceLocator()->get('Doctrine\ORM\EntityManager'));
    }
    return $this->entityManager;
}

一旦我添加了所有这些,我现在可以像这样在我的 getsomethingAction 中进行查询......

public function getsomethingAction() {
    $repository = $this->getEntityManager()->getRepository('Manage\Entity\User');
    $list = $repository->findAll();
    var_dump($list);
    return new ViewModel();
}

对我来说这感觉很笨拙......我可以在不需要所有额外功能的情况下进行插入,但我不能进行选择?是否可以扩展实体类以获取通过调用 $repository = $this->getEntityManager()->getRepository('Manage\Entity\User'); 提供的 find/findAll 等功能 直接在实体内部?

我的意思是我希望能够像设置数据时那样直接在实体上运行查找...如下所示:

public function getsomethingAction(){
    $list = new \Manage\Entity\User();
    $l = $list->findAll();
    var_dump($l);
    return new ViewModel();
}
4

1 回答 1

3

好的,到目前为止,我的主要目标是将复杂的逻辑从控制器中移出到可重用的模型中。因此,通过这个示例答案,我正在创建一个复杂逻辑所在的接口,但它也允许我仍然使用控制器中的模型从数据库中获取数据......这是模型......

namespace Manage\Model;

use Doctrine\ORM\EntityManager;

class ApiInterface {

    /**
     * @var EntityManager
     */
    protected $entityManager;
    protected $sl;

    /**
     * Sets the EntityManager
     *
     * @param EntityManager $em
     * @access protected
     * @return PostController
     */
    protected function setEntityManager(EntityManager $em) {
        $this->entityManager = $em;
        return $this;
    }

    /**
     * Returns the EntityManager
     *
     * Fetches the EntityManager from ServiceLocator if it has not been initiated
     * and then returns it
     *
     * @access protected
     * @return EntityManager
     */
    protected function getEntityManager() {
        if (null === $this->entityManager) {
            $this->setEntityManager($this->sl->get('Doctrine\ORM\EntityManager'));
        }
        return $this->entityManager;
    }

    public function __construct($ServiceLocator) {
        $this->sl = $ServiceLocator;
    }

    public function get() {
        $repository = $this->getEntityManager()->getRepository('Manage\Entity\ApiList');
        return $repository;
    }

    public function set() {
        return new \Manage\Entity\ApiList();
    }

    public function save($data) {
        $objectManager = $this->sl->get('Doctrine\ORM\EntityManager');
        $objectManager->persist($data);
        $objectManager->flush();
    }

    public function doComplexLogic($foo,$bar){
        // Can now use both set() and get() to inspect/modify/add data
    }

}

所以现在在我的控制器中,我可以做一些从表中获取一些基本数据的事情,比如:

public function getapiAction() {
    $api = new \Manage\Model\ApiInterface($this->getServiceLocator());
    var_dump($api->get()->findAll());
    return new ViewModel();
}

为了从控制器快速设置数据,我可以这样做:

public function setapiAction() {
    $apiInterface = new \Manage\Model\ApiInterface($this->getServiceLocator());
    $api= $apiInterface->set();
    $user->setfoo('blah');
    $user->setbar('moo');
    $apiInterface->save($api);
    return new ViewModel();
}

它还允许我通过像这样从控制器中消除复杂性来从控制器运行复杂的逻辑......

public function complexAction(){
    $foo = $this->params()->fromQuery();
    $bar = $this->params()->fromPost();
    $apiInterface = new \Manage\Model\ApiInterface($this->getServiceLocator());
    $apiInterface->doComplexLogic($foo, $bar);
}

如果这个答案是做事的正确方法,请在评论中告诉我,我意识到它非常简单和通用,但我想保持这种方式,以便其他人可以理解是什么/为什么以及这是否是一个好方法/不是等.

于 2013-03-13T21:54:25.667 回答