## 业务举例
这是一个短信邮件平台模块,它在整个系统中有两个职责。
一、负责为其他模块提供短信邮件发送的远程调用接口;
二、有一个后台页面,可以让管理员自定义发送短信,并且可以浏览全部的发送记录。
## 分层说明
1. \[Controller\] DTO、输入输出,控制调度
2. \[Validate\] \[高内聚,可复用\] 对每个业务场景提交的参数进行数据验证 (只负责Client传递的数据)
3. \[Service\] 业务流程处理、Model聚合,Transaction Script
4. \[Model\] \[高内聚,可复用\] 数据持久化操作、模型相关功能
5. \[Config\] 配置信息
## 反例:MVC高于业务
```
application
[config]
Common
Mail
Sms
(more...)
[model]
Base
Mail
Sms
(more...)
[service]
Base
Mail
Sms
(more...)
[validate]
Base
Mail
Sms
(more...)
[controller]
Admin
Mail
Sms
(more...)
```
这样的设计会导致同层逐渐变得臃肿,使项目僵化。如打开Controller层一看就是好几十个,只是把代码块移了一个地方而已,一看源码还是头疼新人接手找都找不到。
## 例子:业务分层包含MVC
>规范的高内聚结构,应遵循业务 > mvc 的原则,可以知道我们的项目庞大但却有条理
~~~
application
[common]
[config]
app.php
...
[model]
base.php
mail.php
sms.php
...
[mail]
[config][非必须]
config.php
...
[service]
mailService.php
smsService.php
[validate]
mailValidate.php
smsValidate.php
[controller]
mailController.php
smsController.php
[admin]
....
~~~
在实际开发过程中对业务模块的界限划分其实是很容易混淆的,此处mail模块的划分粒度是很大的,具体如何划分关联性很强的业务其实没有一个绝对的标准,如果你的用例很复杂或用例大于>30,那么建议使用DDD领域驱动设计进行合理拆分。
原文地址:[https://www.cnkirito.moe/Re-DDD/](https://www.cnkirito.moe/Re-DDD/)
- 一、概述
- 二、项目建议
- 三、样例代码
- 3.1 代码风格
- 3.2 普通业务处理流程示意图
- 3.3 事务业务处理流程示意图
- 四、命名规范
- 五、注释标准
- 5.1 方法函数
- 5.2 非config文件
- 5.3 修改代码
- 5.4 数组参数
- 六、MVC建议
- 七、分层描述
- 7.1 控制器 [ Controller ]
- 7.2 验证器 [ Validate ]
- 7.3 服务层 [ Service ]
- 7.4 模型层 [ Model ]
- 八、输出标准
- 8.1 控制器 Response
- 8.2 验证器 Bool
- 8.3 模型 Model | Exception
- 8.4 服务层 Mixed
- 九、其他说明
- 十、模型说明