ecfectus/pipeline

一个简单的PHP 7管道类

dev-master 2018-02-14 20:57 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:42:18 UTC


README

Build Status

一个简单的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!');
});

第一个或最后一个参数的管道

如上所述,你给管道什么,然后从管道返回的结果就是在完成时给你的结果。

然而,这种灵活性并不总是需要的,例如,如果将管道用作带有请求和响应对象的中间件执行器,你只想返回响应。

这就是FirstArgumentPipelineLastArgumentPipeline类发挥作用的地方。

$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