Zend Framework 2,实体经理和Doctrine 2

时间:2012-10-27 04:40:41

标签: module doctrine-orm zend-framework2 dql

关于实施“便利”查询的最佳实践可能存在疑问。参考这篇文章:

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

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

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

  • 您是否只是在控制器中直接打破DQL,并在需要它的每个控制器中重复DQL? (不是很干)
  • 我们是否尝试从实体或模型中获取对EM的访问权限?

看起来并不像Zend_Db直接使用,你可以在任何你喜欢的地方发送查询,作弊来完成任务。

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

1 个答案:

答案 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()等行为,等...

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