vespolina/workflow

Vespolina 处理工作流的库

dev-master 2015-05-22 00:48 UTC

This package is auto-updated.

Last update: 2024-09-18 20:49:06 UTC


README

Build Status Total Downloads Latest Stable Version SensioLabsInsight Scrutinizer Quality Score Code Coverage Dependency Status

Workflow 是一个库,它允许您首先使用弧线将位置和事务相互连接来构建一个图。然后允许您遍历创建的工作流,每个遍历都可以通过一个令牌来识别。遍历从输入位置节点开始,以给定工作流的一个输出位置节点结束。Workflow 使用记录器来记录遍历的细节。

可令牌化的节点可以执行自定义实现。这些自定义实现可以用于执行基于 Web 应用程序或其他基于过程的系统的流程。

安装

composer require vespolina/workflow dev-master

使用

假设我们想要一个类似以下的工作流


  O -> [A] -> O -> [B] -> O
 in          p1          out

实现并运行它的代码将看起来像这样

 <?php

use Vespolina\Workflow\Task\Automatic;
use Vespolina\Workflow\Place;
use Vespolina\Workflow\Workflow;
use Vespolina\Workflow\Token;
use Vespolina\Workflow\TokenInterface;
use Monolog\Logger;

class NodeA extends Automatic
{
    public function execute(TokenInterface $token)
    {
        if ($token->getData('autoB')) {
            return false;
        }
        $token->setData('autoA', true);

        return true;
    }
}

class NodeB extends Automatic
{
    public function execute(TokenInterface $token)
    {
        if (!$token->getData('autoA')) {
            return false;
        }
        $token->setData('autoB', true);

        return true;
    }
}

$logger = new Logger('test');
$workflow = new Workflow($logger);

// create sequence
$a = new NodeA();
$b = new NodeB();
$place = new Place();
$place->setWorkflow($workflow, $logger);

$workflow->addNode($a, 'a');
$workflow->addNode($place, 'p1');
$workflow->addNode($b, 'b');

$workflow->connectToStart('a');
$workflow->connect('a', 'p1');
$workflow->connect('p1', 'b');
$workflow->connectToFinish('b');

$workflow->accept(new Token());

我们将在日志中看到遍历

... test.INFO: Token accepted into workflow {"token":"[object] (Vespolina\\Workflow\\Token: {})"} []
... test.INFO: Token advanced into workflow.start {"token":"[object] (Vespolina\\Workflow\\Token: {})"} []
... test.INFO: Token advanced into a {"token":"[object] (Vespolina\\Workflow\\Token: {})"} []
... test.INFO: Token advanced into p1 {"token":"[object] (Vespolina\\Workflow\\Token: {})"} []
... test.INFO: Token advanced into b {"token":"[object] (Vespolina\\Workflow\\Token: {})"} []
... test.INFO: Token advanced into workflow.finish {"token":"[object] (Vespolina\\Workflow\\Token: {})"} []