关于实施“便利”查询的最佳实践可能存在疑问。参考这篇文章:
很明显,实体管理器在IndexController中可用 - 他执行findAll列出数据库的全部内容。但是,如果我们在数据库中添加了“band”列,将其映射出来,并想要披头士乐队查询所有专辑,该怎么办?如果披头士乐队的专辑在整个代码库中经常被使用,那会怎么样(弱的例子,但你明白了)。
EM似乎只在控制器中可用,并且Classes似乎并不真正了解服务定位器。
看起来并不像Zend_Db直接使用,你可以在任何你喜欢的地方发送查询,作弊来完成任务。
感谢您帮助我从Table Gateway世界跨越到“真正的”ORM。
答案 0 :(得分:2)
Erm,Doctrine 2能够处理关系(例如:乐队到专辑,反之亦然)
只要您将类定义为服务,就可以在您希望的每个类中使用EntityManager。即在Module.php
内你可以定义这样的工厂:
// Implement \Zend\ModuleManager\Feature\ServiceProviderInterface
public function getServiceConfig() {
return array(
//default stuff
'factories' array(
'my-album-service' = function($sm) {
$service = new \My\Service\Album();
$service->setEntityManager($sm->get('doctrine.entitymanager.orm_default'));
return $service;
}
)
)
);
然后,您可以从每个知道ServiceManager的类调用此类,如$this->getServiceLocator()->get('my-album-service')
然后,该类将自动注入Doctrine EntityManager。
要明确:您所做的所有查询都应该位于您的服务中。你有你的实体,它们基本上是来自Doctrine 2的DB_Mapper,然后你有你的服务,它运行add()
,edit()
,findAll()
,findCustomQuery()
等行为,等...
然后,您将使用控制器中的数据填充服务,服务将数据返回给控制器,控制器会将所述数据传递给视图。这对你有意义并回答你的问题吗?