Yii框架不内置工作流引擎,无法直接实现审批流,因其核心是MVC调度与ActiveRecord封装,缺乏BPMN解析、任务流转、节点跳转等流程语义支持;强行用status字段+if-else会导致状态爆炸、不可回退、无审计日志等问题。

Yii 框架本身不内置工作流引擎,要实现业务流程自动化,必须引入第三方流程引擎(如 Flowable、Activiti)或自研轻量状态机,并通过 Yii 的控制器、模型和事件机制做胶水层集成。硬套“Yii 工作流”概念容易踩坑——它没有 WorkflowBehavior 这类开箱即用组件(Yii 2.0/3.0 均未提供),所有流程控制逻辑需你主动设计。
为什么不能直接用 Yii 自带模块实现审批流?
Yii 的核心是 MVC 调度和 ActiveRecord 封装,并不处理“任务流转”“节点跳转”“会签聚合”等流程语义。它的 yii\base\Behavior 可挂载逻辑,但无法替代 BPMN 解析器或流程执行引擎。常见误区是试图用多个 status 字段 + if-else 控制流转,结果导致:
- 状态分支爆炸,
switch嵌套超过 5 层后难以维护 - 无法回退、挂起、委托、超时自动推进等标准流程能力
- 历史轨迹不可查,审计日志靠手写
log(),缺乏统一上下文
Flowable 6.7.2 + Yii 2.0 集成的关键动作
这是目前最可行的企业级方案(参考 RuoYi-Flowable-Plus 架构思路,但剥离 Spring Boot 层)。重点不是“怎么装”,而是“怎么让 Yii 主动调用 Flowable REST API 并同步状态”:
- 在 Yii 控制器中封装
FlowableClient类,用curl或GuzzleHttp\Client调用 Flowable 的/process-definitions、/process-instances等 REST 接口 - 流程启动时,Yii 传入业务主键(如
leave_id)作为businessKey,确保流程实例与业务数据可关联 - 用户任务查询走
/tasks?assignee={userId},任务完成时 POST 到/task/{id}/complete并附带表单变量(JSON 格式) - 监听 Flowable 的 webhook 或轮询
/history/historic-process-instances,更新 Yii 模型的current_status和last_flow_event
注意:Flowable 默认使用 H2 内存库,生产必须改配置指向 MySQL,否则重启后流程定义全丢——这在 Yii 的 config/main.php 里配无效,得改 Flowable 的 flowable.cfg.xml 或 Spring Boot 配置项(若混部)。
用 Yii 行为(Behavior)模拟轻量状态机的适用场景
如果流程极简单(例如:草稿 → 提交 → 审核中 → 通过/拒绝),且无并行、网关、退回需求,可用 StatusBehavior 手动管理:
- 在模型中定义
public $status,映射为整数或字符串枚举 - 绑定自定义 Behavior,重写
events()返回[Model::EVENT_BEFORE_INSERT => 'onBeforeInsert']等钩子 - 关键方法如
applyAction($action)中校验当前状态是否允许触发该动作(如 “只有 status=1 才能 submit”),失败抛InvalidParamException - 状态变更时自动写入
updated_at和updated_by,避免裸 SQL 更新
这种做法适合内部系统小功能模块,但一旦出现“部门负责人审批后,还需财务复核”,就得重构成真实流程引擎——行为层无法表达条件分支和角色路由。
真正难的不是调接口或写状态,而是把业务规则翻译成流程图语言:哪个节点需要人工介入、哪些字段必须在某环节填写、超时谁来催办、驳回后表单数据是否保留……这些必须在 BPMN 设计器里画清楚,再由 Yii 去适配,而不是反过来让代码去猜流程。


















