ecfectus / pipeline
一个简单的PHP 7管道类
dev-master
2018-02-14 20:57 UTC
Requires
- php: >=7.0.0
Requires (Dev)
- phpdocumentor/phpdocumentor: 2.*
- phpunit/phpunit: ^5.5.0
This package is not auto-updated.
Last update: 2024-09-14 19:42:18 UTC
README
一个简单的PHP 7管道类。
ecfectus管道是一个无观点的顺序执行器,它接收管道,并将给定的值通过每个管道运行,返回最终结果。
与其他对参数数量有严格要求的管道不同,ecfectus管道将接受并返回你给它的一切。
如果你给它1个参数,那么你会得到什么,对于6个参数或更多也是一样。
$pipeline new Ecfectus\Pipeline\Pipeline(); $pipeline->push(function($arg, callable $next){ return $next($arg + 1); }); $result = $pipeline(1);//$result = 2 $pipeline new Ecfectus\Pipeline\Pipeline(); $pipeline->push(function($arg, $arg2, callable $next){ return $next($arg + 1, $arg2); }); $result = $pipeline(1,3);//$result = [2, 3]
更重要的是,它还会告诉你管道是否完成,或者是否从某个管道提前返回。
$pipeline new Ecfectus\Pipeline\Pipeline(); $pipeline->push(function($arg, callable $next){ return $next($arg); }); $pipeline->push(function($arg, callable $next){ return $arg; }); $pipeline->push(function($arg, callable $next){ return $next($arg + 1); }); $result = $pipeline(0);//$result = 0 $pipeline->finished();// == false as pipe 2 returned a result, not $next();
设计上,传递的管道必须是callable
,并且它们将按顺序调用。然而,这并不是一成不变的,如果你需要,可以设置自己的解析器来解析每个管道,这在使用ioc容器时非常完美,或者为了提供特定于应用程序的语法,如Class@method
。
$pipeline new Ecfectus\Pipeline\Pipeline(); $pipeline->setResolver(function($pipe){ if(is_string($pipe)){ //parse string, or fetch from ioc container $pipe = $someContainer->get($pipe); } if(is_callable($pipe)){ return $pipe; } throw new InvalidArgumentException('Whoah, we could find that pipe!'); });
第一个或最后一个参数的管道
如上所述,你给管道什么,然后从管道返回的结果就是在完成时给你的结果。
然而,这种灵活性并不总是需要的,例如,如果将管道用作带有请求和响应对象的中间件执行器,你只想返回响应。
这就是FirstArgumentPipeline
或LastArgumentPipeline
类发挥作用的地方。
$pipeline new Ecfectus\Pipeline\FirstArgumentPipeline(); $pipeline->push(function($arg, $arg2, callable $next){ return $next($arg + 1, $arg2); }); $result = $pipeline(0,0);//$result = 1 $pipeline new Ecfectus\Pipeline\LastArgumentPipeline(); $pipeline->push(function($arg, $arg2, callable $next){ return $next($arg + 1, $arg2 + 2); }); $result = $pipeline(0,0);//$result = 2