masroore / pipeline
管道模式实现
0.1.1
2022-03-06 12:17 UTC
Requires
- php: ^7.4|^8.0|^8.1
Requires (Dev)
- phpunit/phpunit: ^9.5
README
管道
一个用于构建多阶段工作流的PHP包。
此包提供了一种管道模式的实现。
安装
$ 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
目录以获取更多信息。