本文目录导读:

我来详细介绍一下PHP工作流的相关知识。
什么是工作流
工作流(Workflow)是将业务逻辑中的任务、步骤、条件和流转规则进行抽象化、自动化的过程,它帮助你管理和追踪业务处理的各个阶段。
PHP中实现工作流的方式
使用工作流引擎库
Symfony Workflow(最流行)
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
use Symfony\Component\Workflow\Registry;
// 定义工作流
$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder
->addPlaces(['draft', 'review', 'published', 'rejected'])
->addTransition(new Transition('submit', 'draft', 'review'))
->addTransition(new Transition('approve', 'review', 'published'))
->addTransition(new Transition('reject', 'review', 'rejected'))
->addTransition(new Transition('resubmit', 'rejected', 'review'))
->build();
// 创建标记存储器
$markingStore = new MethodMarkingStore(true, 'status');
// 创建工作流
$workflow = new Workflow($definition, $markingStore);
// 使用工作流
class Article {
private $status = 'draft';
public function getStatus() { return $this->status; }
public function setStatus($status) { $this->status = $status; }
}
$article = new Article();
$workflow->apply($article, 'submit');
echo $article->getStatus(); // 输出: review
使用EasyWorkflow
use EasyWorkflow\WorkflowManager;
$workflowConfig = [
'article' => [
'states' => ['draft', 'review', 'published', 'rejected'],
'transitions' => [
'submit' => ['from' => 'draft', 'to' => 'review'],
'approve' => ['from' => 'review', 'to' => 'published'],
'reject' => ['from' => 'review', 'to' => 'rejected'],
'resubmit' => ['from' => 'rejected', 'to' => 'review'],
]
]
];
$workflowManager = new WorkflowManager($workflowConfig);
自定义工作流实现
简单的状态机模式
class WorkflowStateMachine {
private $currentState;
private $transitions = [];
private $guards = [];
public function __construct($initialState) {
$this->currentState = $initialState;
}
public function addTransition($name, $from, $to, $guard = null) {
$this->transitions[$name] = [
'from' => $from,
'to' => $to,
'guard' => $guard
];
}
public function apply($transition) {
if (!isset($this->transitions[$transition])) {
throw new \Exception("Transition {$transition} not found");
}
$t = $this->transitions[$transition];
if ($this->currentState !== $t['from']) {
throw new \Exception("Cannot apply {$transition} from state {$this->currentState}");
}
// 检查守卫条件
if ($t['guard'] && !$t['guard']()) {
throw new \Exception("Guard condition failed for {$transition}");
}
$this->currentState = $t['to'];
return true;
}
public function getCurrentState() {
return $this->currentState;
}
}
// 使用示例
$workflow = new WorkflowStateMachine('draft');
$workflow->addTransition('submit', 'draft', 'review', function() {
return true; // 可以添加验证逻辑
});
$workflow->addTransition('approve', 'review', 'published', function() {
return true; // 检查审批权限
});
$workflow->apply('submit');
echo $workflow->getCurrentState(); // 输出: review
工作流的常见应用场景
审批系统
class ApprovalWorkflow {
private $approvalFlow = [
'pending' => [
'submit' => ['to' => 'manager_review', 'roles' => ['employee']],
'cancel' => ['to' => 'cancelled', 'roles' => ['employee', 'admin']]
],
'manager_review' => [
'approve' => ['to' => 'director_review', 'roles' => ['manager']],
'reject' => ['to' => 'rejected', 'roles' => ['manager']]
],
'director_review' => [
'approve' => ['to' => 'approved', 'roles' => ['director']],
'reject' => ['to' => 'rejected', 'roles' => ['director']]
],
'approved' => null,
'rejected' => null,
'cancelled' => null
];
public function processTransition($currentState, $action, $user) {
$transitions = $this->approvalFlow[$currentState];
if (!$transitions || !isset($transitions[$action])) {
throw new \Exception("Invalid transition");
}
$transition = $transitions[$action];
if (!in_array($user['role'], $transition['roles'])) {
throw new \Exception("Permission denied");
}
return $transition['to'];
}
}
订单处理流程
class OrderWorkflow {
private $orderStates = [
'new' => [
'pay' => 'paid',
'cancel' => 'cancelled'
],
'paid' => [
'ship' => 'shipped',
'refund' => 'refunded'
],
'shipped' => [
'deliver' => 'delivered',
'return' => 'returned'
],
'delivered' => [
'complete' => 'completed'
]
];
public function processOrder(Order $order, $action) {
$currentState = $order->getStatus();
if (!isset($this->orderStates[$currentState][$action])) {
throw new \Exception("Cannot perform {$action} on order in {$currentState} state");
}
$newState = $this->orderStates[$currentState][$action];
$order->setStatus($newState);
$order->save();
// 触发事件
$this->triggerEvent($action, $order);
}
private function triggerEvent($action, $order) {
// 发送通知、更新日志等
}
}
工作流的最佳实践
分离逻辑与数据
// 工作流配置单独存放
return [
'workflows' => [
'article' => [
'marking_store' => [
'type' => 'method',
'property' => 'status',
],
'supports' => ['App\Entity\Article'],
'places' => ['draft', 'review', 'published', 'rejected'],
'transitions' => [
'submit' => [
'from' => 'draft',
'to' => 'review',
],
'approve' => [
'from' => 'review',
'to' => 'published',
],
],
],
],
];
使用事件监听
class WorkflowEventListener {
public function onTransition($event) {
$workflow = $event->getWorkflow();
$subject = $event->getSubject();
$transition = $event->getTransition();
// 记录日志
$this->logger->info("Workflow transition", [
'transition' => $transition->getName(),
'subject' => get_class($subject),
'subject_id' => $subject->getId()
]);
// 发送通知
$this->notifier->sendNotification($subject, $transition);
}
}
权限控制
class WorkflowGuard {
public function canTransition($subject, $transition, $user) {
$permissions = [
'submit' => ['editor'],
'approve' => ['manager', 'admin'],
'reject' => ['manager', 'admin'],
'publish' => ['admin']
];
$allowedRoles = $permissions[$transition] ?? [];
return in_array($user->getRole(), $allowedRoles);
}
}
推荐的工作流库
- Symfony Workflow - 最成熟、功能最全
- Laravel Workflow - Laravel生态的集成方案
- PHP Workflow - 轻量级解决方案
- Yii Workflow - Yii框架的集成方案
- Petri - 基于Petri网的工作流引擎
选择工作流方案时需要考虑:
- 项目规模和复杂度
- 团队熟悉的技术栈
- 是否需要可视化界面
- 性能要求
- 可扩展性需求
对于中小型项目,建议使用成熟的库如Symfony Workflow;对于大型项目,可以考虑自定义实现或使用专门的BPM系统。