Zend框架数据层架构

时间:2012-05-31 21:06:03

标签: php zend-framework datamapper

我正在关注Zend QuickStart指南,并且对连接数据库的架构感到有些困惑。我看到4层:

ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database

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

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

4 个答案:

答案 0 :(得分:3)

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

解释一下:

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

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

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

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

您会注意到许多经验丰富的ZF开发人员立即推荐Doctrine或其他一些ORM,对于他们来说这可能是正确的选择(并且似乎对某些人反射)。在我至少了解ORM正在做什么的基础知识之前,我觉得我不应该开始使用ORM。

<强> [编辑]

基本映射器类中的

fetchAll()等效方法,将Zend_Db_Table_Abstract的实例传递给__constructor

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()方法

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;
    }

祝你好运

答案 1 :(得分:2)

此处给出了非常好的解释:http://martinfowler.com/eaaCatalog/dataMapper.html

简短的引用:

  

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

答案 2 :(得分:0)

就个人而言,虽然我喜欢Zend Framework,但我发现数据层库相当差。我现在使用的是DoctrineBisna相结合来整合两者。也许你应该看看那些?

答案 3 :(得分:0)

Zend_Db_Table解决方案是»表数据网关模式的实现。该解决方案还包括一个实现»行数据网关模式的类。

您可以查看Table Data GatewayRow Data Gateway

中的模式