当前位置:首页 > PHP

php 工作流实现

2026-01-29 05:19:20PHP

PHP 工作流实现方法

使用状态机模式

状态机模式适合处理具有明确状态转换的工作流。定义状态和转换规则,通过条件判断实现状态切换。

class WorkflowStateMachine {
    private $currentState;

    public function __construct($initialState) {
        $this->currentState = $initialState;
    }

    public function transition($event) {
        switch ($this->currentState) {
            case 'draft':
                if ($event === 'submit') {
                    $this->currentState = 'pending_review';
                }
                break;
            case 'pending_review':
                if ($event === 'approve') {
                    $this->currentState = 'approved';
                } elseif ($event === 'reject') {
                    $this->currentState = 'rejected';
                }
                break;
        }
    }

    public function getCurrentState() {
        return $this->currentState;
    }
}

数据库驱动工作流

在数据库中存储工作流定义和实例数据,使用表结构管理状态和转换。

php 工作流实现

CREATE TABLE workflows (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);

CREATE TABLE workflow_states (
    id INT AUTO_INCREMENT PRIMARY KEY,
    workflow_id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    FOREIGN KEY (workflow_id) REFERENCES workflows(id)
);

CREATE TABLE workflow_transitions (
    id INT AUTO_INCREMENT PRIMARY KEY,
    workflow_id INT NOT NULL,
    from_state_id INT NOT NULL,
    to_state_id INT NOT NULL,
    event VARCHAR(255) NOT NULL,
    FOREIGN KEY (workflow_id) REFERENCES workflows(id),
    FOREIGN KEY (from_state_id) REFERENCES workflow_states(id),
    FOREIGN KEY (to_state_id) REFERENCES workflow_states(id)
);

使用 Symfony Workflow 组件

Symfony 提供了强大的 Workflow 组件,支持复杂的工作流定义和操作。

use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Registry;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;

$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder
    ->addPlaces(['draft', 'review', 'approved', 'rejected'])
    ->addTransition(new Transition('submit', 'draft', 'review'))
    ->addTransition(new Transition('approve', 'review', 'approved'))
    ->addTransition(new Transition('reject', 'review', 'rejected'))
    ->build();

$marking = new MethodMarkingStore(true, 'currentState');
$workflow = new Workflow($definition, $marking);

$document = new Document();
$workflow->apply($document, 'submit');

Laravel 队列系统

对于异步工作流任务,可以使用 Laravel 的队列系统处理长时间运行的任务。

php 工作流实现

class ProcessDocument implements ShouldQueue {
    public function handle(Document $document) {
        // 处理文档工作流逻辑
        $document->status = 'processed';
        $document->save();
    }
}

// 分发任务
ProcessDocument::dispatch($document)->onQueue('workflow');

事件驱动架构

通过事件监听器实现松散耦合的工作流步骤,适合分布式系统。

class DocumentSubmitted {
    public $document;
    public function __construct(Document $document) {
        $this->document = $document;
    }
}

class SendReviewNotification {
    public function handle(DocumentSubmitted $event) {
        // 发送审核通知
    }
}

Event::listen(
    DocumentSubmitted::class,
    [SendReviewNotification::class, 'handle']
);

// 触发事件
event(new DocumentSubmitted($document));

工作流引擎集成

对于企业级应用,可以考虑集成 Camunda 或 Activiti 等工作流引擎,通过 REST API 与 PHP 应用交互。

$client = new GuzzleHttp\Client();
$response = $client->post('https://engine.example.com/process-definition/key/document-approval/start', [
    'json' => [
        'variables' => [
            'documentId' => ['value' => $document->id, 'type' => 'string']
        ]
    ]
]);

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

相关文章

php实现文件上传

php实现文件上传

文件上传的基本实现 在PHP中实现文件上传需要使用$_FILES超全局数组处理上传的文件数据。表单必须设置enctype="multipart/form-data"属性,并采用POST方法提交。 创…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT A…