php - Zend Framework 数据层架构

标签 php zend-framework datamapper

我正在遵循 Zend 快速入门指南,但对连接数据库的架构有点困惑。我看到 4 层:

ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database

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

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

最佳答案

ZF 快速入门提供了数据映射器模式的示例,该模式似乎与 ZF 1.x 配合得相当好。您不需要实现数据映射器来使用 Zend_Db。只需使用 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;
    }

来 self 的表特定映射器的 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;
    }

祝你好运

关于php - Zend Framework 数据层架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841265/

相关文章:

php - 查找联合中的记录 - MySQL

php - Laravel 表单模型绑定(bind)未填充的一对一关系

Ruby/Sinatra/DataMapper 多对多如何创建对象

ruby - 无论我如何构建它们,我的 DataMapper 模型都会出现同样的错误

php - 外部 js 和 css 未在 codeigniter 中加载

php - 可编辑的动态php表

php - 在移动设备上,Mysql 查询关键字更改为 php 中的未知字符集

php - Zend Framework - 在重定向时将变量从一个 Controller 传递到另一个 Controller

php - 分析缓慢的 Zend Framework MVC 设置

ruby - 如何在 LIKE 与 Datamapper 之间建立 OR 条件?