From 229c3fa33e3527f5da775fa62085be9fa03e0daf Mon Sep 17 00:00:00 2001 From: Roman Kinyakin <1@grep.su> Date: Wed, 6 Apr 2016 00:41:19 +0600 Subject: [PATCH] [5.2] Allow objects to be passed as pipes Allows following code to be executed, very useful in case pipes require some complex constructing or already exist. ```php (new Pipeline($app))->send($subject)->through([new A, new B])->via('pipe_method')->then(...); ``` --- src/Illuminate/Pipeline/Pipeline.php | 11 +++++++---- tests/Pipeline/PipelineTest.php | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Illuminate/Pipeline/Pipeline.php b/src/Illuminate/Pipeline/Pipeline.php index 56d35bca17af..90d9a1e65ec3 100644 --- a/src/Illuminate/Pipeline/Pipeline.php +++ b/src/Illuminate/Pipeline/Pipeline.php @@ -117,12 +117,15 @@ protected function getSlice() // the appropriate method and arguments, returning the results back out. if ($pipe instanceof Closure) { return call_user_func($pipe, $passable, $stack); - } else { + } elseif (! is_object($pipe)) { list($name, $parameters) = $this->parsePipeString($pipe); - - return call_user_func_array([$this->container->make($name), $this->method], - array_merge([$passable, $stack], $parameters)); + $pipe = $this->container->make($name); + $parameters = array_merge([$passable, $stack], $parameters); + } else { + $parameters = [$passable, $stack]; } + + return call_user_func_array([$pipe, $this->method], $parameters); }; }; } diff --git a/tests/Pipeline/PipelineTest.php b/tests/Pipeline/PipelineTest.php index c616d1a01cd5..b31e1045bbef 100644 --- a/tests/Pipeline/PipelineTest.php +++ b/tests/Pipeline/PipelineTest.php @@ -27,6 +27,21 @@ public function testPipelineBasicUsage() unset($_SERVER['__test.pipe.two']); } + public function testPipelineUsageWithObjects() + { + $result = (new Pipeline(new Illuminate\Container\Container)) + ->send('foo') + ->through([new PipelineTestPipeOne]) + ->then(function ($piped) { + return $piped; + }); + + $this->assertEquals('foo', $result); + $this->assertEquals('foo', $_SERVER['__test.pipe.one']); + + unset($_SERVER['__test.pipe.one']); + } + public function testPipelineUsageWithParameters() { $parameters = ['one', 'two'];