sassnowski/pipeline

PHP的一个简单管道实现。

0.1.1 2016-07-07 13:18 UTC

This package is auto-updated.

Last update: 2024-08-29 04:53:35 UTC


README

Build Status Code Climate Test Coverage SensioLabsInsight

PHP的一个简单管道实现。

摘要

此软件包允许您通过一系列步骤发送一个值。每个步骤都对前一个步骤的返回值进行操作。如果没有管道,您最终会得到像这样深层次的函数调用。

fn5(fn4(fn3(fn2(fn1($initialValue)))));

使用管道,您可以把上面的例子转换为这个

Pipeline::pipe($initialValue)
    ->through($fn1)
    ->through($fn2)
    ->through($fn3)
    ->through($fn4)
    ->through($fn5)
    ->run();

这使得执行步骤的顺序更加清晰,并消除了函数调用的讨厌和丑陋的嵌套。

用法

use Sassnowski\Pipeline\Pipeline;

Pipeline::pipe(10)
    ->through(function ($i) { return $i + 10; })
    ->run();
// 11

构建可重用管道

through($fn)方法不会改变现有的管道,而是返回一个新的管道实例,其中包含下一个步骤。这使得您可以重用管道的部分。

由于在管道中初始化值与可重用性的理念相悖,因此定义了一个额外的build()方法。build方法不会用值初始化管道。在这种情况下,必须在调用run方法时提供值。

$pipeline1 = Pipeline::build()->through(function ($i) { return $i + 1 });

// Use the existing pipeline and simply add on additional steps.
$pipeline2 = $pipeline1->through(function ($i) { return $i * 10; });

// The initial pipeline remains unchanged.
$pipeline1->run(10); // 11

$pipeline2->run(10); // 110

基于类的步骤

可以使用类作为步骤而不是函数。类只需要实现魔法__invoke方法。

class Add10
{
    function __invoke($i)
    {
        return $i + 10;
    }
}

// Somewhere else
Pipeline::pipe(10)
    ->through(new Add10)
    ->run();
// 20

如果执行步骤需要大量的额外业务逻辑,而这些逻辑不属于包含管道的对象,这非常有用。

异常

如果向管道中添加的步骤未能通过is_callable检查,则将抛出InvalidArgumentException

Pipeline::pipe(10)->through(10); // InvalidArgumentException

如果使用build方法创建管道,则必须将初始值传递给run方法。不这样做将导致RuntimeException

Pipeline::build()->through(function ($i) { return $i + 10; })->run() // RuntimeException

方法别名

为了在构建管道时实现更易于阅读的语法,存在多个through方法的别名。

  • firstThrough()
  • andThen()
Pipeline::pipe(10)
    ->firstThrough($fn1)
    ->andThen($fn2)
    ->andThen($fn3)
    ->run();

许可证

MIT