在MVC框架中实现DDD - PHP

Sus*_*ha7 13 php model-view-controller design-patterns domain-driven-design laravel

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

在域驱动设计域模型中.

域模型是抽象系统,描述知识,影响或活动领域(域)的选定方面.然后,该模型可用于解决与该域相关的问题

开发人员已阅读Domain Driven Design,或正在使用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
Run Code Online (Sandbox Code Playgroud)


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

Zha*_*rro 8

在mvc中,模型是一个层,它包含所有域业务逻辑.

我怀疑MVC模式本身是否声明了Domain的特殊之处.它将模型作为一个属性包运行,并不关心它是如何创建的以及它如何保护它的不变量.

与此同时,Onion架构指出,将Domain从应用程序服务中分离出来很重要(MVC框架就是这样).所以我喜欢将包含实体,值对象,域事件聚合的域层放置到单独的模块或顶级文件夹中.

在此输入图像描述

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

我建议您查看这个ASP MVC项目结构.它由着名的DDD专家设计.除了域名,请看看MVC部分的组织方式.它利用了功能切片方法,这种方法现在变得越来越流行,我发现它非常有用.