用途:该技能用于设计、实现或审查非平凡的应用用例,把它们写成 Action——单一职责的类或函数,每个 Action 独占一个源文件,显式接收依赖,接收与调用上下文无关的运行时数据,只执行一个业务操作,并能被直接测试。它解决“胖控制器”和“上帝服务”问题,把业务工作流从入口点和宽泛服务中移出,变成 RegisterUserAction、ProcessPaymentAction、SendInvitationAction 这类小而命名的单元。
主要能力与原则:单一职责,每个 Action 只做一个业务操作,需要第二个公开方法就应拆成第二个 Action;一个 Action 一个文件,函数式 Action 同样适用,barrel 文件(如 index.ts)可重导出但不得定义 Action;只承载业务逻辑,哈希密码、格式化货币、发 HTTP 请求、解析 CSV、校验邮箱格式等应交给库或工具;上下文无关,Action 不知道 HTTP 请求、响应、会话、CLI 参数或框架请求对象,只接收普通数据并返回结果。命名统一使用 Action 后缀,并按语言给出类/函数名与文件名约定(如 PHP 的 CreateUserAction.php、TypeScript 的 create-user.action.ts、Python 的 create_user_action.py)。目录按领域分组,如 src/actions/auth/、billing/、team/。依赖注入:类用构造函数注入服务、仓库、网关、其他 Action,调用方法只接收运行时数据;函数式 Action 则把依赖与数据都作为参数。语言支持时优先使用可调用类(PHP 的 __invoke、Python 的 call),且不要把 Action 类标记为 final,以便装饰、包装或继承扩展。
使用方式:先判断请求行为属于业务操作、工具、查询还是入口点关注点;定位最小单一操作并用 Action 后缀命名;设计无上下文输入形状与显式返回值;类通过构造函数、函数通过参数注入依赖;在独立源文件中实现;由控制器、路由、命令、任务、监听器等薄入口调用;用 mock 依赖直接测试并运行相关测试套件。
适用场景:创建、重构或审查业务操作、用例、命令、应用服务或工作流;把逻辑从控制器、路由处理器、CLI 命令、任务、监听器或宽泛服务中移出;组织协调仓库、服务、通知、事件、事务或外部系统的业务规则;让用例无需经过 HTTP、CLI、队列或框架入口即可独立测试。
限制:不适用于仅构建基础设施或可复用工具(HTTP 客户端、解析器、格式化器、校验器、序列化器、SDK 封装)、无依赖无副作用的纯数据转换、简单只读查询或平凡 CRUD 透传,以及 UI 组件、路由胶水、schema 定义、迁移或框架配置(除非它们调用 Action)。若请求可能同时指业务用例或工具/基础设施辅助,应先检查周边代码;仅当操作边界或预期副作用仍不清晰时才请求澄清。实施前需检查仓库中既有的 Action、用例、命令、服务、CQRS 或领域层约定,语言、框架、依赖注入容器、测试框架与文件命名风格,调用 Action 的入口点及其可传入的普通运行时数据,Action 所需依赖,以及同一行为的既有测试和必须保留的领域规则与错误情况。当必需的业务规则、事务边界、副作用、授权预期或返回值无法从代码库安全推断时,应先询问用户。官方资料未提供收费、价格、平台或效果信息。