php - 在 MVC 框架中实现 DDD - PHP

标签 php laravel design-patterns model-view-controller domain-driven-design

在 mvc 中,模型是一个层,它包含所有领域业务逻辑。
在领域驱动设计中,业务逻辑可以分为各种构建 block ,例如。

在领域驱动设计中,领域模型是。

A domain model is a system of abstractions that describes selected aspects of a sphere of knowledge, influence or activity (a domain). The model can then be used to solve problems related to that domain

开发人员已阅读领域驱动设计,或正在使用 Doctrine2 或 Hibernate, 通常更关注DDD中的领域模型。mvc框架中的模型层与DDD中的领域模型是重叠的。这意味着我们可以在mvc框架中的模型文件夹中实现领域模型

这样的实现如下所示。显示了模型文件夹的结构

   Model(this can model or domain)
   | 
   |----Entities
   |    |---BlogPost.php
   |    |---Comment.php
   |    |---User.php
   | 
   |----Repositories
   |    |---BlogPostRepository.php
   |    |---CommentRepository.php
   |    |---UserRepository.php
   | 
   |----Services
   |    |---UserService.php
   | 
   |----factories
   |    |---userfactory.php
   | 
   |----dataMappers
   |    |---userDataMapper.php // this inherit from Eloquent model
   | 
   |----ValueObject


  • 我想知道我的第一个假设(可以在 mvc 框架中的模型文件夹中实现域模型)是否正确?
  • DDD 中的所有构建 block 都在模型文件夹(如上所示)中实现,例如实体、服务、存储库,设计是否正确
  • 或您对此实现有任何其他建议。
  • 如果这是错误的,那么在 MVC 框架中实现 DDD 构建 block (例如实体、服务、存储库)的正确方法是什么

最佳答案

in mvc the model is a layer and it's contain all the domain business logic.

我怀疑 MVC 模式本身声明了有关域的特殊内容。它将模型作为一袋属性来操作,并不关心它是如何创建的以及如何保护其不变量。

同时Onion architecture指出将域与应用程序服务(即 MVC 框架)隔离很重要。因此,我喜欢将包含实体、值对象、域事件和聚合的域层放置到单独的模块中或顶级文件夹。

enter image description here

将 Domain 与 MVC 内容分开放置的另一个原因是,它可以让您更轻松地管理多个 bounded contexts ,因为每个上下文都需要自己的模块/文件夹。

我建议你查看this ASP MVC project结构。它是由著名的DDD专家设计的。除了领域之外,请看一下MVC部分是如何组织的。它利用feature slice这种方法现在越来越流行,我发现它非常有用。

关于php - 在 MVC 框架中实现 DDD - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42803820/

相关文章:

c# - 在运行时将类型传递给 FirstOrDefault

php - 是否可以在 PHP 7 上指定多种返回类型?

php - 如何为使用 cat/dev/null > 重置日志文件的 cronjob 编写 PHP 脚本

javascript - 如何在动态运行时选择下拉列表

laravel - 了解 Laravel 中的路由

design-patterns - 策略模式的功能类比是什么?

c++ - 使用 Qt 4 在 C++ 中设计模式

javascript - 错误请求 :Error function and timeout in ajax never fired

php - laravel 作用域适用于每个模型实例吗?

laravel - 我无法在我的 laravel 项目中安装视频缩略图