php 工作流实现
PHP 工作流实现方法
使用状态机模式
状态机模式是实现工作流的经典方法。通过定义状态和转移条件,可以清晰地管理流程。
class WorkflowStateMachine {
private $currentState;
public function __construct($initialState) {
$this->currentState = $initialState;
}
public function transition($newState) {
if ($this->canTransition($newState)) {
$this->currentState = $newState;
return true;
}
return false;
}
private function canTransition($newState) {
// 实现状态转移逻辑
$allowedTransitions = [
'draft' => ['review', 'cancel'],
'review' => ['approved', 'rejected']
];
return in_array($newState, $allowedTransitions[$this->currentState] ?? []);
}
}
使用工作流引擎
Symfony Workflow组件提供专业的工作流管理功能,适合复杂场景。
安装组件:
composer require symfony/workflow
配置工作流:
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Registry;
use Symfony\Component\Workflow\Workflow;
$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder
->addPlaces(['draft', 'review', 'approved', 'rejected'])
->addTransition(new Transition('to_review', 'draft', 'review'))
->addTransition(new Transition('approve', 'review', 'approved'))
->addTransition(new Transition('reject', 'review', 'rejected'))
->build();
$markingStore = new MethodMarkingStore(true, 'currentState');
$workflow = new Workflow($definition, $markingStore);
数据库驱动工作流
在数据库中存储工作流定义和实例状态,适合需要持久化的场景。

创建工作流表:
CREATE TABLE workflows (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
initial_state VARCHAR(255) NOT NULL
);
CREATE TABLE workflow_transitions (
id INT AUTO_INCREMENT PRIMARY KEY,
workflow_id INT NOT NULL,
from_state VARCHAR(255) NOT NULL,
to_state VARCHAR(255) NOT NULL,
FOREIGN KEY (workflow_id) REFERENCES workflows(id)
);
PHP实现:
class DatabaseWorkflow {
private $pdo;
private $workflowId;
public function __construct(PDO $pdo, $workflowId) {
$this->pdo = $pdo;
$this->workflowId = $workflowId;
}
public function getNextStates($currentState) {
$stmt = $this->pdo->prepare("SELECT to_state FROM workflow_transitions
WHERE workflow_id = ? AND from_state = ?");
$stmt->execute([$this->workflowId, $currentState]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
}
事件驱动工作流
通过事件监听器实现工作流扩展,适合需要灵活扩展的场景。

class WorkflowEventDispatcher {
private $dispatcher;
public function __construct() {
$this->dispatcher = new Symfony\Component\EventDispatcher\EventDispatcher();
}
public function addTransitionListener($eventName, callable $listener) {
$this->dispatcher->addListener($eventName, $listener);
}
public function dispatch($eventName, $event) {
$this->dispatcher->dispatch($eventName, $event);
}
}
class WorkflowTransitionEvent extends Symfony\Component\EventDispatcher\Event {
private $fromState;
private $toState;
public function __construct($fromState, $toState) {
$this->fromState = $fromState;
$this->toState = $toState;
}
}
工作流可视化
使用Graphviz等工具生成工作流图,帮助理解和调试。
安装Graphviz:
sudo apt-get install graphviz
生成DOT文件:
function generateWorkflowDot($workflowDefinition) {
$dot = "digraph workflow {\n";
foreach ($workflowDefinition['transitions'] as $transition) {
$dot .= " {$transition['from']} -> {$transition['to']};\n";
}
$dot .= "}\n";
file_put_contents('workflow.dot', $dot);
}
执行命令生成图片:
dot -Tpng workflow.dot -o workflow.png






