Download the PHP package wiseadmin/wise-workflow without Composer
On this page you can find all versions of the php package wiseadmin/wise-workflow. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download wiseadmin/wise-workflow
More information about wiseadmin/wise-workflow
Files in wiseadmin/wise-workflow
Package wise-workflow
Short Description WiseAdmin 工作流引擎 — 支持流程定义、多实例流转、条件分支、超时处理与事件通知,内置状态机驱动
License Apache-2.0
Homepage https://github.com/hiwiseadmin/wise-workflow
Informations about the package wise-workflow
Wise-Workflow 工作流引擎
基于 ThinkPHP 6/8 的轻量级工作流引擎,深度集成 WiseAdmin 框架的 RBAC、插件系统和事件系统
设计思想参考 Symfony Workflow,专为 WiseAdmin 生态定制
版本:v2.0 | PHP >= 8.1 | ThinkPHP >= 6.0
目录
- 概述
- 核心概念
- 架构设计
- 安装与配置
- 快速上手
- API 参考
- 定义工作流
- 注册工作流
- 引擎操作
- 组合 Facade
- 权限守卫
- 事件系统
- 历史记录
- 数据库表结构
- 插件集成指南
- WorkflowDemo 演示插件
- 与 WiseAdmin 框架集成
- CLI 命令
- 进阶用法
- 常见问题
- 开发与测试
概述
Wise-Workflow 是 WiseAdmin 生态的工作流引擎组件,采用状态机模型(Place-Transition),可为任意业务对象(如订单、工单、审批单等)添加状态流转能力。它提供了完整的工作流定义、状态转换、权限检查、事件触发和历史记录等功能。
设计理念
| 设计原则 | 说明 |
|---|---|
| 轻量级 | 只实现 80% 项目需要的功能,避免功能冗余 |
| 深度集成 | 与 WiseAdmin 的 RBAC、插件系统、事件系统、数据库层无缝对接 |
| 易用性 | 插件开发者使用成本低,与 ThinkPHP 框架风格一致 |
| 可扩展性 | 支持自定义守卫、存储、事件监听 |
功能特性
- 基于 Place-Transition 模型的状态机工作流引擎
- 支持从数据库动态加载工作流定义,也支持代码静态注册
- 深度集成 WiseAdmin RBAC 权限系统,每个转换均可绑定权限标识
- 自动触发
before_transition/after_transition生命周期事件 - 完整的转换历史记录,包含操作人、操作IP、上下文数据
- 支持 Guard 守卫机制(字符串权限 / 回调函数)
- 通过 CLI 命令 + 标准迁移管理数据库表,完美支持版本升级和数据初始化
- 提供 Facade 门面简化调用,一行代码完成状态转换
- 支持插件工作流自动发现与注册
- 支持自定义状态存储(默认数据库,可扩展为 Redis 等)
核心概念
| 概念 | 英文 | 类 | 说明 |
|---|---|---|---|
| 工作流 | Workflow | wise\workflow\Workflow |
工作流定义,包含名称、所有状态、所有转换规则、初始状态、元数据 |
| 状态节点 | Place | wise\workflow\Place |
工作流中的一个状态,如 "draft"(草稿)、"reviewing"(审核中) |
| 转换规则 | Transition | wise\workflow\Transition |
状态间的转换路径,定义从哪些状态(from)可以转换到哪些状态(to) |
| 标记 | Marking | array |
当前对象所处的工作流状态集合(如 ['draft' => 1]) |
| 引擎 | WorkflowEngine | wise\workflow\WorkflowEngine |
核心执行引擎,负责 apply()、can()、init() 等操作 |
| 注册表 | WorkflowRegistry | wise\workflow\WorkflowRegistry |
全局工作流管理中心,支持静态注册和数据库动态加载 |
| 状态存储 | MarkingStore | wise\workflow\MarkingStoreInterface |
持久化存储工作流状态的接口(默认实现:数据库) |
| 守卫 | Guard | wise\workflow\GuardListener |
权限检查机制,确保只有授权用户才能执行特定转换 |
状态转换示意图
架构设计
分层结构
Wise-Workflow 采用双层架构设计:
目录结构
安装与配置
前置条件
- PHP >= 7.4
- ThinkPHP >= 6.0
- ThinkORM >= 3.0
- MySQL 5.7+(或兼容数据库)
- [可选] WiseAdmin 框架 >= 1.0.0
通过 Composer 安装
数据库表创建
Wise-Workflow 使用 标准 ThinkPHP 迁移 管理数据库表,保证升级时表结构和初始化数据的一致性与可追溯性。
创建数据库表分为两步:
提示:
wise:workflow:publish命令会自动将包内的迁移文件复制到database/migrations/目录。如果目标文件已存在会自动跳过。
ServiceProvider 自动注册(最小绑定)
Wise-Workflow 通过 Composer 自动发现机制加载 Service 类,仅做一项必要绑定:
| 绑定 | 说明 |
|---|---|
MarkingStoreInterface → DatabaseMarkingStore |
状态存储接口实现 |
其余类(WorkflowEngine、WorkflowRegistry、Place、Transition 等)由用户主动 use 导入后直接使用,保持依赖关系清晰可见:
安装后运行 composer dump-autoload 使 Service 自动发现生效即可。
快速上手
步骤一:定义工作流
在插件或应用代码中定义一个工作流:
步骤二:注册工作流
将定义好的工作流注册到全局注册表:
步骤三:使用工作流引擎
三步走总结
API 参考
定义工作流
Place 类(状态节点)
示例:
Transition 类(转换规则)
示例:
Workflow 类(工作流定义)
注册工作流
WorkflowRegistry 类
两种注册方式:
引擎操作
WorkflowEngine 类
核心方法说明
| 方法 | 说明 | 返回值 |
|---|---|---|
init(Workflow $workflow, string $subject, array $context) |
初始化工作流(设置到初始状态) | void |
apply(Workflow $workflow, string $subject, string $transitionName, array $context) |
执行一次状态转换 | array 转换后的新状态 |
can(Workflow $workflow, string $subject, string $transitionName, array $context) |
检查是否可执行转换 | bool |
getEnabledTransitions(Workflow $workflow, string $subject) |
获取当前可用的转换列表 | Transition[] |
getMarking(string $subject) |
获取当前状态 | array |
setMarking(string $subject, array $marking, array $context) |
设置状态 | void |
getHistory(string $subject, int $limit = 50) |
获取转换历史 | array |
apply() 完整执行流程
subject 参数说明
subject 是流程实例的唯一标识,格式为 {类型}:{ID}:
组合 Facade
在 WiseAdmin 应用层中,提供了一个增强版的组合 Facade,一行代码完成常用操作:
| 方法 | 说明 | 示例 |
|---|---|---|
init($workflowName, $subject) |
初始化工作流状态 | Workflow::init('order_approval', $order) |
apply($workflowName, $subject, $transition, $context) |
执行状态转换 | Workflow::apply('order_approval', $order, 'submit') |
can($workflowName, $subject, $transition) |
检查是否可执行 | Workflow::can('order_approval', $order, 'submit') |
transitions($workflowName, $subject) |
获取可用转换列表 | Workflow::transitions('order_approval', $order) |
marking($workflowName, $subject) |
获取当前状态 | Workflow::marking('order_approval', $order) |
is($workflowName, $subject, $place) |
判断是否处于某状态 | Workflow::is('order_approval', $order, 'draft') |
exists($workflowName) |
判断工作流是否存在 | Workflow::exists('order_approval') |
register($workflow) |
注册工作流 | Workflow::register($workflow) |
history($workflowName, $subject, $limit) |
获取历史记录 | Workflow::history('order_approval', $order, 10) |
完整示例:
权限守卫
Wise-Workflow 通过 GuardListener 实现基于 RBAC 的权限控制。
GuardListener 类
工作原理
使用方式
方式一:在 Transition 上绑定权限字符串(推荐)
方式二:在上下文 Context 中传递权限
权限命名规范
| 模式 | 说明 | 示例 |
|---|---|---|
{module}.{action} |
模块级权限 | order.submit, order.approve |
workflow.{name}.{transition} |
工作流转换权限 | workflow.order_approval.approve |
workflow.{name}.* |
工作流全部权限 | workflow.order_approval.* |
workflow.* |
所有工作流权限 | workflow.* |
事件系统
工作流引擎在每次状态转换前后会触发事件,支持开发者注册监听器实现自定义逻辑。
事件列表
| 事件名称 | 触发时机 | 参数 | 用途 |
|---|---|---|---|
workflow.before_transition |
转换执行前 | {workflow, transition, subject, context} |
权限检查、前置条件验证、阻止非法操作 |
workflow.after_transition |
转换执行后 | {workflow, transition, subject, context} |
记录日志、发送通知、更新关联数据 |
workflow.{name}.{transition} |
特定转换执行后 | {workflow, transition, subject, context} |
特定场景的自定义逻辑 |
使用示例
阻止非法转换
历史记录
每一次状态转换都会自动记录到 workflow_history 表中。
查询历史
历史记录数据结构
数据库表结构
Wise-Workflow 使用三张核心表:
workflow_definition(工作流定义表)
| 字段 | 类型 | 说明 |
|---|---|---|
id |
INT(11) PK | 主键ID |
name |
VARCHAR(50) UNIQUE | 工作流名称(唯一标识) |
title |
VARCHAR(100) | 工作流显示名称 |
description |
VARCHAR(255) | 工作流描述 |
places |
TEXT(JSON) | 状态节点列表,如 ["draft","submitted","approved"] |
transitions |
TEXT(JSON) | 转换规则列表,如 [{"name":"submit","from":["draft"],"to":["submitted"]}] |
initial_place |
VARCHAR(50) | 初始状态名称 |
status |
TINYINT(1) | 1=启用, 0=禁用 |
create_time |
DATETIME | 创建时间 |
update_time |
DATETIME | 更新时间 |
workflow_marking(状态标记表)
| 字段 | 类型 | 说明 |
|---|---|---|
id |
INT(11) PK | 主键ID |
subject |
VARCHAR(100) UNIQUE | 流程实例标识(如 order:1001) |
marking |
TEXT(JSON) | 当前状态标记,如 {"submitted":1} |
create_time |
DATETIME | 创建时间 |
update_time |
DATETIME | 更新时间 |
workflow_history(历史记录表)
| 字段 | 类型 | 说明 |
|---|---|---|
id |
INT(11) PK | 主键ID |
subject |
VARCHAR(100) INDEXED | 流程实例标识 |
transition_name |
VARCHAR(50) INDEXED | 转换名称 |
from_place |
VARCHAR(50) | 源状态 |
to_place |
VARCHAR(50) | 目标状态 |
context |
TEXT(JSON) | 上下文数据 |
user_id |
INT(11) | 操作用户ID |
ip |
VARCHAR(45) | 操作IP |
user_agent |
VARCHAR(255) | 浏览器标识 |
create_time |
DATETIME INDEXED | 创建时间 |
插件集成指南
在 WiseAdmin 插件中使用工作流引擎只需三步:
第一步:在 Plugin.php 中定义工作流
第二步:在 BootServiceProvider.php 中注册
第三步:在控制器中使用
在 manifest.json 中添加菜单和权限
WorkflowDemo 演示插件
WiseAdmin 提供了一个完整的 WorkflowDemo 演示插件,位于 plugins/workflowdemo/,展示订单审批工作流的完整实现。
演示工作流
权限标识
| 权限标识 | 对应操作 |
|---|---|
workflow.order.submit |
提交审核 |
workflow.order.assign |
分配审核员 |
workflow.order.approve |
审核通过 |
workflow.order.reject |
审核拒绝 |
workflow.order.resubmit |
重新提交 |
workflow.order.cancel |
取消订单 |
目录结构
运行演示
与 WiseAdmin 框架集成
容器绑定(自动完成)
Service 类通过 Composer 自动发现加载,仅绑定 MarkingStoreInterface → DatabaseMarkingStore。
使用时直接导入对应类即可:
CLI 命令
wise:workflow:publish 命令会完成以下操作:
- 扫描包内
src/migrations/目录下的迁移文件 - 逐个复制到
database/migrations/目录 - 如果目标文件已存在,自动跳过
- 输出完成提示,引导用户执行系统迁移
进阶用法
自定义状态存储
默认使用数据库存储(workflow_marking 表),可以扩展到 Redis 等:
自定义守卫条件
高级场景下可使用回调守卫:
工作流定义存储到数据库
将工作流定义存储到 workflow_definition 表,实现动态管理:
业务对象的状态冗余
建议在业务表中冗余存储当前状态字段,方便查询:
常见问题
Q: 如何判断当前工作流状态?
Q: 如何获取当前可执行的操作列表?
Q: 如何自定义权限检查逻辑?
修改 Transition 的 guard 回调即可:
Q: 一个业务对象可以绑定多个工作流吗?
可以。每个工作流通过 name 区分,绑定到不同的 subject,互不影响。同一个业务对象可以通过不同的 subject 标识绑定不同工作流:
Q: 如何回滚到上一个状态?
工作流引擎本身不提供"回滚"功能。如果需要,可以定义一个反向的 Transition:
Q: 表前缀如何配置?
Wise-Workflow 使用 ThinkPHP 的数据库连接配置,自动适配项目中的表前缀设置(ws_):
开发与测试
运行单元测试
依赖
| 依赖 | 版本要求 | 说明 |
|---|---|---|
| PHP | >= 7.4 | 核心语言 |
| topthink/framework | >= 6.0 | ThinkPHP 6 框架 |
| topthink/think-orm | >= 3.0 | ThinkORM 数据库组件 |
开发依赖
| 依赖 | 版本 | 说明 |
|---|---|---|
| phpunit/phpunit | >= 9.0 | 单元测试 |
| mockery/mockery | >= 1.0 | Mock 框架 |
许可协议
MIT License
更多信息请参考 WiseAdmin 框架文档和 WorkflowDemo 演示插件。
All versions of wise-workflow with dependencies
topthink/framework Version ^8.0
topthink/think-orm Version ^3.0
wiseadmin/wise-support Version 1.0.*