在具有如下文件夹结构的 PHP DDD 应用程序中:
应用程序/ 意见/ 控制器/ 领域/ 模型/(orm生成) 服务/ 工厂/
以下类代表什么(从 DDD 术语的角度来看)以及它们的推荐位置是什么。
在具有如下文件夹结构的 PHP DDD 应用程序中:
应用程序/ 意见/ 控制器/ 领域/ 模型/(orm生成) 服务/ 工厂/
以下类代表什么(从 DDD 术语的角度来看)以及它们的推荐位置是什么。
这看起来不像 DDD 应用程序。
特别是,ORM 生成的模型不是领域模型。这是一件好事,如果您的应用程序核心价值在于数据并且您只需要处理 CRUD 操作。
在 DDD 中,应用程序模型来自领域专家的语言,即了解您的应用程序所针对的业务的人,因为这是他自己的工作,但对技术一无所知。
如果您的领域专家谈论字典和 UserCollection(很奇怪,顺便说一句),那么这些类实际上是模型。HtmlValidator,几乎按照定义,不是一个商业术语。
如果您的应用程序的价值来自技术组件,我建议您避免使用 DDD 技术。仅将 DDD 用于处理非常复杂的业务规则的应用程序。
编辑
大多数时候域模型值得(至少)一个单独的模块。在 PHP 中,我建议您将其捆绑在(至少)一个单独的包中。但是,使用 MVC 模式并不意味着使用 DDD:您可以将 MVC 用于数据驱动的应用程序,这很好。在这种情况下,我只会在模型中放入 ORM 生成的类。在这种情况下,我会将所有这些类放在一个 controllers/lib 文件夹中。
结构还不错,但我会将模型重命名为实体,因为在 MVC 中,模型由服务、实体和其他类型的类组成。
Dictionary 和 HtmlValidator 没有身份并且是无状态的,这意味着它们属于服务。
app/
views/
controllers/
domain/
entities/ ( orm generated )
services/ (HtmlValidator)
factories/
尽管它看起来像一个非常简单的应用程序,但这确实意味着您不应该开始使用 DDD 构建块。每个应用程序都会随着时间的推移而增长,最好从适当的结构开始,以避免以后需要对其进行重构。
我接下来你应该考虑创建某种模块,这样你就可以分离逻辑部分。您也可以将应用程序和表示层与域和基础设施层分开:
app/
views/
controllers/
domain/
module1
entities/
services/
factories/
module2
....
vendor/ (infrastructure layer)
ORM
... (some other 3rd party libs)