有一个关于实现"方便"查询的最佳实践的问题。参考本文:
http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/#toc-安装条令模块
很明显,实体管理器在IndexController中是可用的——他执行findAll来列出数据库的全部内容。然而,如果我们在数据库中添加了一个"乐队"列,将其绘制出来,并想查询披头士乐队的所有专辑,会怎么样?如果披头士乐队的专辑在整个代码库中经常被使用(这个例子很弱,但你明白了)。
EM似乎只在控制器中可用,而类似乎并没有真正意识到服务定位器。
- 你会简单地在控制器中中断DQL,并在每个需要它的控制器中重复DQL吗?(不是很干)
- 我们是否会从实体或模型中骗取对EM的一些访问权限
不像直接使用Zend_Db那样简单,你可以在任何你喜欢的地方触发查询,作弊来完成任务。
感谢您帮助我从表网关世界过渡到"真正的"ORM。
Erm,条令2能够处理关系(例如:乐队到专辑,反之亦然)
只要将类定义为服务,EntityManager就可以在您希望的每个类中使用。也就是说,在你的Module.php
中,你可以定义这样一个工厂:
// Implement ZendModuleManagerFeatureServiceProviderInterface
public function getServiceConfig() {
return array(
//default stuff
'factories' array(
'my-album-service' = function($sm) {
$service = new MyServiceAlbum();
$service->setEntityManager($sm->get('doctrine.entitymanager.orm_default'));
return $service;
}
)
)
);
然后,您可以从每个知道ServiceManager(如$this->getServiceLocator()->get('my-album-service')
)的类中调用该类
然后,该类将自动注入Doctrine EntityManager。
需要明确的是:您要做的所有查询都应该位于您的服务内。你会有你的实体,基本上是条令2中的DB_Mapper,然后你有你的服务,运行add()
、edit()
、findAll()
、findCustomQuery()
等操作…
然后,您将使用来自控制器的数据填充您的服务,服务将把数据返回给控制器,控制器将把所述数据传递给视图。这对你和回答你的问题有意义吗?