San*_*hal 8 model-view-controller activerecord domain-driven-design zend-framework dry
我一直在阅读多个PHP框架,尤其是Zend框架,但我对前进的正确方法感到困惑.
Zend Framework不使用ActiveRecords,而是使用表数据网关和行数据网关模式,并使用DataMapper将行数据网关的内容映射到模型,因为当模型没有1时,ActiveRecord会崩溃: 1映射到数据库表.Zend快速入门指南中有一个例子.
对我来说,他们的例子看起来非常臃肿,到处都是大量的吸气剂和制定者.我发现了各种关于Domain Driven Design的博客文章,认为使用这么多的getter和setter是不好的做法,因为它将所有内部模型数据暴露给外部,因此它没有公共属性的优势.这是一个例子.
我的问题:如果你删除那些getter和setter,你将如何呈现你的观点?在某些时候,数据必须点击视图,以便您可以实际向用户显示某些内容.遵循DDD建议似乎打破了MVC中M和V之间的分离.继MVC和Zend之后,似乎打破了DDD并让我为所有模型输入了大量的getter,setter和DataMappers.除了做大量工作外,它似乎也违反了DRY.
我真的很感谢一些(链接)好的例子或更多关于它们如何组合在一起的信息.我正在努力提高我的架构和设计技巧.
使用值对象,您可以消除其中一些公共 setter 方法。这是实体和值对象之间差异的描述。值对象是不可变的,并且通常与实体绑定。如果使用构造函数传递所有值,则无需从外部代码设置这些属性。
一些额外的东西,与答案没有直接关系,但更关注 DDD:
(免责声明:我对 Zend Framework 的唯一了解是我在链接文章中读到的内容。)Zend Framework 使用 DataMappers 而不是 Repositories。这真的是 DDD 式的吗?好吧,福勒对存储库的解释可能会说不。然而,Eric Evans 指出 DDD 存储库可以非常简单。最简单的是,存储库是一个 DataMapper(请参阅 DDD 书籍)。对于更复杂且仍然是 DDD 的内容,请参阅 Fowler 文章。DDD 有一个可能与模式定义不同的概念性存储库。
我强烈建议您继续阅读有关领域驱动设计的内容。我认为 getter 和 setter 违反 DDD 的假设存在缺陷。DDD 关注领域模型和实现这一目标的最佳实践。访问器只是一个小细节。