我正在关注Zend QuickStart指南,并且对连接数据库的架构感到有些困惑。我看到4层:
ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database
我之前使用过一种架构,其中有一个文件具有直接映射到数据库的属性,而一个扩展类包含钩子和数据库操作事件的所有自定义代码。
我在哪里可以找到一个很好的解释,为什么有这样的三个文件是必要的,而不是让ModelClass继承DbTable?
答案 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)
答案 3 :(得分:0)
Zend_Db_Table解决方案是»表数据网关模式的实现。该解决方案还包括一个实现»行数据网关模式的类。
中的模式