php 工作流实现
PHP 工作流实现方法
使用状态机模式
状态机模式适合处理具有明确状态转换的工作流。定义状态和转换规则,通过条件判断实现状态切换。
class Workflow {
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'],
'approved' => ['published'],
'rejected' => ['draft']
];
return in_array($newState, $allowedTransitions[$this->currentState] ?? []);
}
}
使用工作流引擎库
Symfony Workflow组件提供完整的工作流管理功能,支持状态机和工作流定义。
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Workflow;
$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder
->addPlaces(['draft', 'review', 'approved', 'published'])
->addTransition(new Transition('to_review', 'draft', 'review'))
->addTransition(new Transition('approve', 'review', 'approved'))
->addTransition(new Transition('publish', 'approved', 'published'))
->build();
$marking = new MethodMarkingStore(true, 'currentState');
$workflow = new Workflow($definition, $marking);
$document = new Document('draft');
$workflow->apply($document, 'to_review');
数据库驱动工作流
在数据库中存储工作流定义和实例状态,适合需要持久化和复杂流程的场景。
CREATE TABLE workflows (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
initial_state VARCHAR(255) NOT NULL
);
CREATE TABLE transitions (
id INT AUTO_INCREMENT PRIMARY KEY,
workflow_id INT,
from_state VARCHAR(255),
to_state VARCHAR(255),
FOREIGN KEY (workflow_id) REFERENCES workflows(id)
);
class DatabaseWorkflow {
public function getNextStates($currentState, $workflowId) {
$pdo = new PDO('mysql:host=localhost;dbname=workflow', 'user', 'pass');
$stmt = $pdo->prepare("SELECT to_state FROM transitions WHERE from_state = ? AND workflow_id = ?");
$stmt->execute([$currentState, $workflowId]);
return $stmt->fetchAll(PDO::FETCH_COLUMN);
}
}
事件驱动工作流
通过事件监听器实现工作流扩展,适合需要异步处理或集成外部系统的场景。
$dispatcher = new EventDispatcher();
$dispatcher->addListener('workflow.transition', function (WorkflowEvent $event) {
$subject = $event->getSubject();
$transition = $event->getTransition();
if ($transition->getName() === 'publish') {
mail('admin@example.com', 'Document published', "Document {$subject->id} was published");
}
});
$workflow->apply($document, 'publish', ['dispatcher' => $dispatcher]);
使用状态模式
将每个状态封装为独立对象,符合开闭原则,适合复杂状态逻辑。

interface State {
public function proceed(Document $document);
public function cancel(Document $document);
}
class DraftState implements State {
public function proceed(Document $document) {
$document->setState(new ReviewState());
}
}
class Document {
private $state;
public function __construct() {
$this->state = new DraftState();
}
public function proceed() {
$this->state->proceed($this);
}
}
选择建议
简单流程可使用状态机模式快速实现,复杂企业级应用推荐使用Symfony Workflow组件。需要持久化的工作流应考虑数据库驱动方案,事件驱动适合需要高度可扩展性的场景。






