我一直在阅读多个PHP框架,特别是Zend框架,但我对正确的前进方向感到困惑。DataMapper模式是否打破MVC?
Zend Framework不使用ActiveRecords,而是使用Table Data Gateway和Row Data Gateway模式,并使用DataMapper将行数据网关的内容映射到模型,因为ActiveRecord在您的模型不与您的数据库表有1:1映射。 Zend Quickstart指南中有一个example of this。
对我来说,他们的例子看起来非常臃肿,各地都有大量的getter和setter。我遇到过各种关于领域驱动设计的博客文章,他们认为使用如此多的getter和setter是不好的做法,因为它将所有内部模型数据公开给外部,所以它没有优于公共属性。 Here is one example。
我的问题:如果你删除了这些getter和setters,你将如何渲染你的视图?在某些时候,数据必须显示在视图上,以便您可以向用户显示某些内容。遵循DDD的建议似乎打破了MVC中M和V之间的分离。遵循MVC和Zend的例子似乎打破了DDD,让我为我的所有模型输入了大量的getter,setters和DataMapper。除了做很多工作外,它似乎也违反了DRY。
我真的很感激一些(链接)好的例子或更多关于它如何融合在一起的信息。我试图在这里提高我的建筑和设计技能。
谢谢。那篇恶毒的文章能够很好的阅读。我还会读到系列的其余部分。 – 2009-06-24 08:14:38
这是一个很好的答案,我会补充说,getters,setters有什么不对。事实上,拥有它们是增加验证逻辑的绝佳方式。公开物业是快速和肮脏的,可以在原型制作时使用,但不是一个很好的长期解决方案。假设你想改变一个属性的名字。如果你这样做,每一个访问该属性的代码都需要改变。如果您使用访问器方法的通用名称,则不必更改客户端代码。另外,Doctrine是比Zend DB更丰富的解决方案。我不会推荐Doctrine1,但是请尝试Doctrine2。 – 2010-08-20 08:26:49