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
Data Mapper是一个软件层,用于将内存中对象与数据库分开.它的职责是在两者之间传输数据,并将它们彼此隔离.使用Data Mapper,即使存在数据库,内存中的对象也不需要知道; 他们不需要SQL接口代码,当然也不了解数据库模式.
如何在关系数据库中存储数据通常与在内存中构造对象的方式不同.例如,一个对象将有一个包含其他对象的数组,而在数据库中,您的表将具有另一个表的外键.由于对象 - 关系阻抗不匹配,您在域对象和数据库之间使用中介层.这样,您可以在不影响另一方的情况下进化.
在单一责任原则中,更紧密地遵循其自身层中的映射责任.您的对象不需要了解DB逻辑,反之亦然.这为您在编写代码时提供了更大的灵活性.
当您不想使用域模型时,通常不需要DataMapper.如果您的数据库表很简单,那么使用TableModule和TableDataGateway甚至只是ActiveRecord可能会更好.
对于其他各种模式,请参阅我的答案
模型的概念是在代码中包含逻辑数据集合.
DataMapper的想法是将这个应用程序级数据集与您存储它的方式联系起来.
对于许多ActiveRecord实现,框架不提供意图分离,这可能导致问题.例如,BlogPost模型可以包含博客文章的基本信息
但也许你也希望它包含类似的东西:
现在你可以将所有这些数据存储在一个MySQL表格中,但随着你的博客的发展和你变得超级出名,你会发现你的统计数据遭受了大量的点击,你想把它移到单独的数据库服务器.
您如何在不更改应用程序代码的情况下将BlogPost对象的这些字段迁移到其他数据存储?
使用DataMapper,您可以修改对象保存到数据库的方式以及从数据库加载的方式.这使您可以调整存储机制,而无需更改应用程序所依赖的实际信息集合.