Laravel 中 Services 和 Domain Actions 有什么区别?
在 AI 主导开发的项目中,Domain Actions 能提供比通用 Service 更明确的业务边界。
问题
Laravel 项目中的 Services 和 Domain Actions 有什么区别?在 AI 辅助开发时应该如何选择?
回答
Service 通常是按技术层或模块划分的容器,例如 OrderService、PaymentService。它适合承载跨多个用例的通用操作,但边界容易随着功能增长而变得模糊。
Domain Action 则按单一业务意图命名,例如 PlaceOrder、RefundPayment。每个 Action 只做一件事,输入输出明确,更利于 AI 理解上下文、生成测试,以及人类 code review。
在 AI 主导开发的项目里,Action 的命名即文档:模型看到 CancelSubscription 就知道该读哪些模型、触发哪些事件,而不必在一个 800 行的 Service 里搜索。
关键结论
- Service 适合技术复用;Domain Action 适合业务意图表达。
- AI 生成代码时,Action 粒度小、依赖少,出错面更可控。
- 不必二选一:Action 内部可以调用共享 Service,但对外入口优先 Action。
操作步骤
- 列出当前 Service 中的 public 方法,按业务动词重命名。
- 每个 Action 单独文件,构造函数注入依赖。
- Controller 只调用 Action,不写业务逻辑。
- 为每个 Action 写一条 feature test,作为 AI 回归基准。
限制与注意事项
- 小项目过度拆分 Action 会增加文件数量;团队小于 3 人时可从核心域开始。
- Action 不是 Silver Bullet:复杂编排仍可用 Job / Pipeline 组合多个 Action。
内容根据真实对话整理,删除了重复和隐私信息。