在Zend中,为什么我们使用DB Model类和Mapper类作为两个独立的?

时间:2012-02-17 14:21:35

标签: php oop zend-framework design-patterns poeaa

我正在研究zend项目,我指的是其他zend项目来创建新的Zend Project.But我不喜欢盲目地遵循该项目而不理解。在Zend目录结构中,In Model类主要有两种类型,比如

- models
   - DbTables
        - Blog.php  //Extends Zend_Db_Table_Abstract
   - Blog.php       // Contains methods like validate() and save()
   - BlogMapper.php // Also Contains methods like validate(Blog b) & save(Blog b)

为什么遵循这种特定的结构? 这是分开Object类和Database模型类吗?

请解释。

2 个答案:

答案 0 :(得分:12)

DataMapper is a design pattern from Patterns of Enterprise Application Architecture

  

Data Mapper是一个软件层,用于将内存中对象与数据库分开。它的职责是在两者之间传输数据,并将它们彼此隔离。使用Data Mapper,即使存在数据库,内存中的对象也不需要知道;他们不需要SQL接口代码,当然也不需要了解数据库模式。

如何在关系数据库中存储数据通常与在内存中构造对象的方式不同。例如,一个对象将有一个包含其他对象的数组,而在数据库中,您的表将具有另一个表的外键。由于object-relational impedance mismatch,您在域对象和数据库之间使用中介层。这样,您可以在不影响另一方的情况下进化。

Single Responsibility Principle之后,更紧密地跟随自己图层中的制图责任。您的对象不需要了解DB逻辑,反之亦然。这使您在编写代码时具有更大的灵活性。

当您不想使用域模型时,通常不需要DataMapper。如果您的数据库表很简单,那么使用TableModule和TableDataGateway或者甚至只是ActiveRecord可能会更好。

对于其他各种模式,请参阅我对

的回答

答案 1 :(得分:7)

模型的概念是在代码中包含逻辑数据集合。

DataMapper的想法是将这个应用程序级别的数据集与您存储它的方式联系起来。

对于许多ActiveRecord实现,框架不提供意图分离,这可能导致问题。例如,BlogPost模型可以包含像

这样的博客文章的基本信息
  • 标题
  • 作者
  • date_posted

但也许你也希望它包含类似的内容:

  • number_of_reads
  • number_of_likes

现在你可以将所有这些数据存储在一个MySQL表格中,但随着你的博客的发展和你变得超级出名,你会发现你的统计数据遭受了大量的点击而你想要移动它是一个单独的数据库服务器。

如何在不更改应用程序代码的情况下将BlogPost对象的这些字段迁移到其他数据存储?

使用DataMapper,您可以修改对象保存到数据库的方式以及从数据库加载的方式。这使您可以调整存储机制,而无需更改应用程序所依赖的实际信息集合。