masroore/pipeline

管道模式实现

0.1.1 2022-03-06 12:17 UTC

This package is auto-updated.

Last update: 2024-09-12 16:18:54 UTC


README

管道

一个用于构建多阶段工作流的PHP包。

Author Maintainer

此包提供了一种管道模式的实现。

安装

$ composer require masroore/pipeline

管道模式

管道模式允许您通过链式调用阶段轻松地组合顺序阶段。

在此特定实现中,接口由三部分组成

  • PipelineContextInterface
  • PipelineStageInterface
  • PipelineInterface

管道由一个或多个阶段组成。管道可以处理有效负载。在处理过程中,有效负载将被传递到第一个阶段。从那一刻起,结果值将从阶段传递到阶段。

概念

该包有两个构建块用于创建工作流:Pipeline(管道)和Stage(阶段)和Step(步骤)。管道是一系列顺序阶段的集合。

PipelineStageInterface 接口

阶段是可以通过顺序执行与其他阶段一起执行的单元工作。为了做到这一点,我们需要实现 PipelineStageInterface 接口。

interface PipelineStageInterface
{
    public function id(): string;

    public function process(PipelineContextInterface $context): void;
}

为了满足接口,我们需要在目标类型中实现 process()id() 方法。例如

class TimesTwoStage implements PipelineStageInterface
{
    public function process(PipelineContextInterface $context): void
    {
        $val = (int) $context->getPayload();
        $val *= 2;
        $context->setPayload($val);
    }

    public function id(): string
    {
        return __CLASS__;
    }    
}

当前阶段接收由前一个阶段传递的 PipelineContextInterface 值。该 PipelineContextInterface 类型提供了一个 shouldHalt() 方法,可以用来停止管道执行。

使用方法

use Kaiju\Pipeline\PipelineBuilder;
use Kaiju\Pipeline\PipelineContextInterface;
use Kaiju\Pipeline\PipelineStageInterface;

class Payload implements PipelineContextInterface
{
    private int $value;
    private bool $halt;

    public function __construct(int $value)
    {
        $this->value = $value;
        $this->halt = false;
    }

    public function shouldHalt(): bool
    {
        return $this->halt;
    }

    public function setHalt(bool $halt): void
    {
        $this->halt = $halt;
    }

    public function getPayload(): int
    {
        return $this->value;
    }

    public function setPayload($payload): void
    {
        $this->value = (int) $payload;
    }
}

class TimesTwoStage implements PipelineStageInterface
{
    public function process(PipelineContextInterface $context): void
    {
        $val = (int) $context->getPayload();
        $val *= 2;
        $context->setPayload($val);
    }

    public function id(): string
    {
        return __CLASS__;
    }
}

class AddOneStage implements PipelineStageInterface
{
    public function process(PipelineContextInterface $context): void
    {
        $val = (int) $context->getPayload();
        $val++;
        $context->setPayload($val);
        $context->setHalt(true);
    }

    public function id(): string
    {
        return __CLASS__;
    }
}

$payload = new Payload(10);
$builder = (new PipelineBuilder())
    ->addStage(new TimesTwoStage())
    ->addStage(new AddOneStage());
$pipeline = $builder->build();
$pipeline($payload);
echo 'Value is: ' . $payload->getPayload();

查看 examples 目录以获取更多信息。