gpt4 book ai didi

php - Zend Framework 数据层架构

转载 作者:行者123 更新时间:2023-12-02 22:40:30 25 4
gpt4 key购买 nike

我正在遵循 Zend QuickStart 指南,但对连接到数据库的体系结构感到有点困惑。我看到 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 和模型有了一些了解。当我开始构建依赖于多个数据库表的对象时,我才真正开始理解这些部分是如何组合在一起的。
'

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

祝你好运

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com