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

Raj*_*wal 7 php oop design-patterns zend-framework poeaa

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

- 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)
Run Code Online (Sandbox Code Playgroud)

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

请解释.

Gor*_*don 12

DataMapper是来自企业应用程序架构模式的设计模式.

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

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

单一责任原则中,更紧密地遵循其自身层中的映射责任.您的对象不需要了解DB逻辑,反之亦然.这为您在编写代码时提供了更大的灵活性.

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

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


Jus*_*ris 7

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

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

对于许多ActiveRecord实现,框架不提供意图分离,这可能导致问题.例如,BlogPost模型可以包含博客文章的基本信息

  • 标题
  • 作者
  • 身体
  • 发布日期

但也许你也希望它包含类似的东西:

  • number_of_reads
  • number_of_likes

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

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

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