当前位置:首页 > PHP

php 工作流实现

2026-04-03 11:23:58PHP

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]);

使用状态模式

将每个状态封装为独立对象,符合开闭原则,适合复杂状态逻辑。

php 工作流实现

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组件。需要持久化的工作流应考虑数据库驱动方案,事件驱动适合需要高度可扩展性的场景。

标签: 工作流php
分享给朋友:

相关文章

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现推送消息推送消息

php实现推送消息推送消息

PHP 实现消息推送的方法 使用 WebSocket 实现实时推送 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,适合实现实时消息推送。 安装 Ratchet 库(WebSo…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mod_…