首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend框架数据层架构

Zend框架数据层架构
EN

Stack Overflow用户
提问于 2012-06-01 05:06:03
回答 4查看 445关注 0票数 2

我正在遵循Zend QuickStart指南,并且对连接到数据库的体系结构感到有点困惑。我看到了4层:

代码语言:javascript
复制
ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database

我以前使用过一种体系结构,其中有一个文件具有直接映射到数据库的属性,还有一个扩展类包含挂钩和数据库操作事件的所有自定义代码。

我在哪里可以找到一个很好的解释,为什么有必要像这样有三个文件,而不是仅仅让ModelClass继承DbTable?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-01 18:39:16

ZF快速入门提供了一个数据映射器模式的示例,该模式似乎与ZF1.x一起工作得相当好。使用Zend_Db不需要实现数据映射器。只需使用Zend_Db_Table_Abstract提供的DbTable模型和方法,就可以获得相当好的功能。

简单解释一下:

Application_Model_Guestbook:将是一个简单的域模型(与之交互的对象)。

Application_Model_GuestbookMapper:是将数据库列映射到域模型属性的数据映射器。

Application_Model_DbTable_Guestbook:是提供数据库和数据库适配器之间连接的网关模型。在这里,您可以指定数据库表的选项以及与其他表的关系。

在我了解数据映射器如何应用到我的应用程序之前,我需要一点使用ZF和模型的经验。当我开始构建依赖于多个数据库表的对象时,我真的开始理解这些部分是如何组合在一起的。

你会注意到,许多有经验的ZF开发人员立即推荐Doctrine或其他ORM,对于他们来说,这可能是正确的选择(对某些人来说似乎是反射)。我只是觉得我不应该开始使用ORM,直到我至少了解了ORM的基本功能。

编辑

基映射器类中的fetchAll()等效方法,将Zend_Db_Table_Abstract的实例传递给__constructor

代码语言:javascript
复制
public function findAll($order = NULL) {
        $select = $this->_getGateway()->select();
        if (!is_null($order)) {
            $select->order($order);
        }
        $rowset = $this->_getGateway()->fetchAll($select);
        $entities = array();
        foreach ($rowset as $row) {
            //abstract method required in each table mapper, this instantiates the domain model
            $entity = $this->createEntity($row);
            //identiy map allows lazy loading of certain members
            $this->_setMap($row->id, $entity);
            $entities[] = $entity;
        }
        //returns an array of domain models instead
        return $entities;
    }

我的特定于表的映射器的createEntity()方法

代码语言:javascript
复制
public function createEntity($row) {

        $data = array(
            'id'     => $row->id,
            'name'   => $row->name,
            'art'    => $row->art,
            'year'   => $row->year,                
        );

        $entity = new Music_Model_Album($data);
        //set artist id to reference map for lazy loading
        $entity->setReferenceId('artist', $row->artist_id);
        return $entity;
    }

祝好运

票数 3
EN

Stack Overflow用户

发布于 2012-06-01 16:09:40

这里给出了一个非常好的解释:http://martinfowler.com/eaaCatalog/dataMapper.html

一句简短的引述:

数据映射器是将内存中的对象从数据库中分离出来的一层软件。它的职责是在两者之间传输数据,并将它们彼此隔离。使用Data Mapper,内存中的对象甚至不需要知道存在数据库;它们不需要SQL接口代码,当然也不需要了解数据库模式。(数据库模式始终不知道使用它的对象。)由于它是映射器(473)的一种形式,数据映射器本身对于域层甚至是未知的。

票数 2
EN

Stack Overflow用户

发布于 2012-06-01 05:17:33

就我个人而言,尽管我喜欢Zend框架,但我发现数据层库相当差。我现在使用的是DoctrineBisna相结合的方式来集成两者。也许你也应该看看这些?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10841265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档