审批流系统核心是将业务规则转化为可维护的状态机结构,节点需绑定角色、条件与超时规则,通过yii2-workflow解耦配置,服务类封装动作,RBAC强控节点权限。

Yii开发审批流系统时,流程节点配置核心在于把业务规则转化为可维护、可扩展的状态机结构,而不是硬编码在控制器或模型里。关键不是“怎么写代码”,而是“怎么组织流程逻辑”。
节点定义要绑定角色与条件,不能只写死人名
每个节点需明确:
- 处理角色(如“部门经理”“财务专员”),而非具体用户ID,便于人员变动时零代码调整
-
准入条件(如“申请金额 > 5000”“所属部门为技术部”),用 Yii 的
Expression或自定义 Validator 实现,避免 if-else 堆砌 - 超时规则(如“24小时内未处理自动转交”),通过定时任务或流程引擎事件触发
例如,在 WorkflowDefinition.php 中可这样声明节点逻辑:
'approve_dept' => [
'type' => 'task',
'role' => 'dept_manager',
'condition' => ['>=', 'amount', 5000],
'timeout' => 86400, // 秒
'next' => 'approve_finance'
]使用 Yii2-Workflow 扩展统一管理状态流转
推荐直接集成 yii2-workflow(非官方但社区成熟):
- 流程定义写在独立 PHP 配置文件(如
@app/config/workflows/leave.php),和业务代码解耦 - 状态变更通过
$model->trigger('approve')触发,由工作流组件自动校验权限、执行钩子、更新状态字段 - 支持可视化流程图导出(需配合前端插件),方便产品与开发对齐
注意:状态字段必须是模型中真实存在的属性(如 status),且类型为字符串或整型,不能是 JSON 字段。
审批动作要封装成服务类,不放在 Controller
每个节点的业务操作(如发送通知、扣减额度、生成合同)应抽离为独立 Service:
-
LeaveApproveService处理请假审批后的考勤同步 -
ReimburseCheckService核验报销单据合规性 - 所有服务实现统一接口
WorkflowActionInterface,便于后期替换或加日志埋点
这样修改某环节逻辑时,只需改对应 Service,不影响流程骨架。
RBAC 权限必须与节点强关联
Yii 的 RBAC 不只是控制菜单可见性,更要限制“谁能执行当前节点操作”:
- 在
AccessControl或行为(Behavior)中动态检查:if (!$user->can($workflow->getCurrentNode()->role . '_do_action', ['model' => $model])) { throw new ForbiddenHttpException('无权操作此节点'); } - 角色权限命名建议统一前缀,如
node_approve_dept、node_reject_finance,避免和菜单权限混淆
节点配置本身也要受 RBAC 保护——只有“流程管理员”角色才能编辑 workflows/ 下的配置文件。



















