我正在遵循Zend QuickStart指南,并且对连接到数据库的体系结构感到有点困惑。我看到了4层:
ModelClass
ModelClass_Mapper
ModelClass_DbTable
Actual MySQL Database我以前使用过一种体系结构,其中有一个文件具有直接映射到数据库的属性,还有一个扩展类包含挂钩和数据库操作事件的所有自定义代码。
我在哪里可以找到一个很好的解释,为什么有必要像这样有三个文件,而不是仅仅让ModelClass继承DbTable?
发布于 2012-06-01 18:39:16
ZF快速入门提供了一个数据映射器模式的示例,该模式似乎与ZF1.x一起工作得相当好。使用Zend_Db不需要实现数据映射器。只需使用Zend_Db_Table_Abstract提供的DbTable模型和方法,就可以获得相当好的功能。
简单解释一下:
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;
}祝好运
发布于 2012-06-01 16:09:40
这里给出了一个非常好的解释:http://martinfowler.com/eaaCatalog/dataMapper.html
一句简短的引述:
数据映射器是将内存中的对象从数据库中分离出来的一层软件。它的职责是在两者之间传输数据,并将它们彼此隔离。使用Data Mapper,内存中的对象甚至不需要知道存在数据库;它们不需要SQL接口代码,当然也不需要了解数据库模式。(数据库模式始终不知道使用它的对象。)由于它是映射器(473)的一种形式,数据映射器本身对于域层甚至是未知的。
发布于 2012-06-01 05:17:33
就我个人而言,尽管我喜欢Zend框架,但我发现数据层库相当差。我现在使用的是Doctrine和Bisna相结合的方式来集成两者。也许你也应该看看这些?
https://stackoverflow.com/questions/10841265
复制相似问题