能够使用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();
}
对我来说感觉非常笨重...我可以在不需要所有额外功能的情况下进行插入但是我不能做一个选择?是否可以扩展Entity类以获得通过调用$ 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();
}
答案 0 :(得分: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);
}
如果这个答案是正确的做法,请在评论中告诉我,我意识到这很简单和通用但我想保持这种方式,以便其他人能够理解什么/为什么以及这是一个好方法/不是等。