我正在遵循 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/