用途:在 Laravel 项目中实现领域驱动设计(DDD)与整洁架构,把业务用例逻辑从控制器和模型中抽离,形成可测试、可替换的分层结构。
主要能力与约定:
- 目录按业务域分组,例如 app/Domains/Order/{Actions,DTOs,Contracts}/,按 User、Order、Payment 等领域划分,而非按 Controllers、Models 类型划分;标准 Eloquent 模型仍放在 app/Models/。
- DTO:使用 readonly class(PHP 8.2+)或 readonly 属性(PHP 8.1+),带类型化构造属性,用于跨层传递数据,替代原始数组或 Eloquent 模型。
- 仓储模式:在 Contracts/ 定义 OrderRepository 接口,实现 EloquentOrderRepository,并在 AppServiceProvider 中通过 $this->app->bind(OrderRepository::class, EloquentOrderRepository::class) 绑定。
- Action 类:单一职责的用例逻辑,消费 DTO,控制器不直接写 Eloquent 查询。
- 层间流向:Controller → Action → Repository 接口 → Eloquent,DTO 在每次层转换时跨边界传递。
使用方式(新增领域功能的工作流):创建领域文件夹;定义带类型构造属性的 readonly DTO;在 Contracts/ 定义仓储接口;实现 Eloquent 仓储并在 AppServiceProvider 绑定;编写消费 DTO 的单一职责 Action;运行 php artisan tinker 解析接口以确认依赖注入生效。
反模式:控制器中写 Eloquent;跨层传原始数组;上帝服务;依赖具体实现而非接口。
适用场景:中大型 Laravel 项目、需要清晰领域边界与可替换持久层的团队。限制:资料未提供具体版本兼容范围、性能数据、收费信息与完整代码示例,需结合项目实际验证。