1

对实施“便利”查询的最佳实践有疑问。参考这篇文章:

http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/#toc-install-doctrine-modules

很明显,实体管理器在 IndexController 中可用 - 他执行 findAll 以列出数据库的全部内容。但是,如果我们在数据库中添加一个“乐队”列,将其映射出来,并想查询披头士乐队的所有专辑,该怎么办?如果在整个代码库中经常使用甲壳虫乐队的专辑会怎么样(弱例子,但你明白了)。

EM 似乎只在控制器中可用,而类似乎并不真正了解服务定位器。

  • 您是否会直接在控制器中拆分 DQL,并在每个需要它的控制器中重复 DQL?(不是很干)
  • 我们是否可以从实体或模型中获取对 EM 的一些访问权限?

看起来不像直接使用 Zend_Db 那样简单明了,您可以在任何您喜欢的地方触发查询,通过欺骗来完成任务。

感谢您帮助我从 Table Gateway 世界跨入“真正的” ORM。

4

1 回答 1

2

嗯,学说 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()等这样的动作......

然后,您将使用来自控制器的数据填充您的服务,服务会将数据返回给控制器,控制器会将所述数据传递给视图。这对你有意义并回答你的问题吗?

于 2012-10-27T07:44:19.090 回答