当前位置:首页 > 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组件提供完整的工作流管理功能,支持状态机和工作流定义。

php 工作流实现

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

数据库驱动工作流

在数据库中存储工作流定义和实例状态,适合需要持久化和复杂流程的场景。

php 工作流实现

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

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

相关文章

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php 实现链表

php 实现链表

PHP 实现链表的方法 链表是一种线性数据结构,由节点组成,每个节点包含数据和指向下一个节点的指针。PHP 中可以通过类和对象来实现链表。 定义链表节点类 创建一个 ListNode 类,用于表示链…

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n…