2

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

ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database

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

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

4

4 回答 4

3

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

稍微解释一下:

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

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

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

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

您会注意到,许多经验丰富的 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;
    }

祝你好运

于 2012-06-01T10:39:16.413 回答
2

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

一个简短的报价:

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

于 2012-06-01T08:09:40.160 回答
0

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

于 2012-05-31T21:17:33.110 回答
0

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

您可以在Table Data GatewayRow Data Gateway中查看谁的模式

于 2012-05-31T22:28:10.077 回答