sassnowski / pipeline
PHP的一个简单管道实现。
0.1.1
2016-07-07 13:18 UTC
Requires
- php: >=5.5
Requires (Dev)
- codeclimate/php-test-reporter: ^0.3.2
- phpunit/phpunit: ^4.8
This package is auto-updated.
Last update: 2024-08-29 04:53:35 UTC
README
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