领域驱动开发
细分项目层次结构, 是 MVC 的升级版
控制层
职责
-
协议转换
- WebSOCKET, HTTP, RPC 等请求统一处理
- 举例:
- HTTP 携带 token 区分身份
- WebSOCKET 在连接组中取得身份
- RPC 连接时已有身份
- OpenAPI 请求 APPID 区分身份
-
接口转换
处理参数为应用层可以接收的格式
-
参数校验处理
- 校验应用层需要的参数格式,并返回相应错误
- 举例:
- 从请求体中读参数:
- HTTP Request
- WebSOCKET content
- RPC Request
- OpenAPI parse request body
- 对请求参数进行校验
- 校验订单号
- 校验收款账号等
- 调用应用层服务
- 从请求体中读参数:
-
响应处理
- 对于不同的协议,将应用层返回的数据处理成统一格式返回
- 举例
- 得到应用层返回数据进行处理返回:
- HTTP response body
- WebSOCKET write
- RPC write
- OpoenAPI response body
- 得到应用层返回数据进行处理返回:
应用层
-
流程编排
- 将一件事情按照 step 分为多步, 调用领域层的服务来完成业务
- 举例
- 检查订单是否可以创建
- 检查用户余额
- 计算服务费用
- 锁定用户余额
- 订单入库
-
事务控制
- 数据库事务只会在这一层开启结束
- 举例
- 可以整个流程一个事务,也可以细分步骤来开启提交事务
领域层
-
核心业务逻辑
单个 step 实现任务
-
不依赖其它层
不依赖上层也不依赖下层,可以独立运行测试
子域层
-
领域层拆分出来的通用服务
上层领域层的复用功能提取, 更少的业务,更多的技术
基础层
-
只做技术相关
业务无关的服务/可直接复用到其它项目中
仓库层
-
数据仓库
业务层-仓库层-实体层, 查询操作交给 Repository 来进行
实体层
-
数据对象
ORM Model, 将面向对象编程贯彻到位
-
对象数据判断
做基础数据判断,避免 $order->status == 1 这样不易读的代码