From f39afc85db19a1599a203056a6b0b0f31058da4b Mon Sep 17 00:00:00 2001 From: Albin Kerouaton Date: Sun, 13 Sep 2015 17:34:02 +0200 Subject: [PATCH 1/2] Allow variadic controller parameters to be resolved. --- .../Controller/ControllerResolver.php | 7 ++++++- .../Tests/Controller/ControllerResolverTest.php | 17 +++++++++++++++++ .../Fixtures/Controller/VariadicController.php | 10 ++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php diff --git a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php index fbdc993036edc..2fbbe06892ebf 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php @@ -117,9 +117,14 @@ protected function doGetArguments(Request $request, $controller, array $paramete { $attributes = $request->attributes->all(); $arguments = array(); + $variadicAvailable = method_exists('\ReflectionMethod', 'isVariadic'); foreach ($parameters as $param) { if (array_key_exists($param->name, $attributes)) { - $arguments[] = $attributes[$param->name]; + if ($variadicAvailable && $param->isVariadic() && is_array($attributes[$param->name])) { + $arguments = array_merge($arguments, array_values($attributes[$param->name])); + } else { + $arguments[] = $attributes[$param->name]; + } } elseif ($param->getClass() && $param->getClass()->isInstance($request)) { $arguments[] = $request; } elseif ($param->isDefaultValueAvailable()) { diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php index 07bdd0ec7092e..f5502c6f96fa5 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php @@ -12,6 +12,7 @@ namespace Symfony\Component\HttpKernel\Tests\Controller; use Symfony\Component\HttpKernel\Controller\ControllerResolver; +use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController; use Symfony\Component\HttpFoundation\Request; class ControllerResolverTest extends \PHPUnit_Framework_TestCase @@ -196,6 +197,22 @@ public function testGetArguments() $this->assertEquals(array($request), $resolver->getArguments($request, $controller), '->getArguments() injects the request'); } + /** + * @requires PHP 5.6 + */ + public function testGetVariadicArguments() + { + $resolver = new ControllerResolver(); + + $request = Request::create('/'); + $param1 = new \stdClass(); + $param2 = new \stdClass(); + $request->attributes->set('foo', 'foo'); + $request->attributes->set('bar', array($param1, $param2)); + $controller = array(new VariadicController(), 'action'); + $this->assertEquals(array('foo', $param1, $param2), $resolver->getArguments($request, $controller)); + } + public function testCreateControllerCanReturnAnyCallable() { $mock = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolver', array('createController')); diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php new file mode 100644 index 0000000000000..ebca5c4c1d075 --- /dev/null +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php @@ -0,0 +1,10 @@ + Date: Tue, 1 Mar 2016 11:58:16 +0100 Subject: [PATCH 2/2] simplified code --- .../Component/HttpKernel/Controller/ControllerResolver.php | 3 +-- .../HttpKernel/Tests/Controller/ControllerResolverTest.php | 6 ++---- .../Tests/Fixtures/Controller/VariadicController.php | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php index 2fbbe06892ebf..8304dd4a3087e 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php @@ -117,10 +117,9 @@ protected function doGetArguments(Request $request, $controller, array $paramete { $attributes = $request->attributes->all(); $arguments = array(); - $variadicAvailable = method_exists('\ReflectionMethod', 'isVariadic'); foreach ($parameters as $param) { if (array_key_exists($param->name, $attributes)) { - if ($variadicAvailable && $param->isVariadic() && is_array($attributes[$param->name])) { + if (PHP_VERSION_ID >= 50600 && $param->isVariadic() && is_array($attributes[$param->name])) { $arguments = array_merge($arguments, array_values($attributes[$param->name])); } else { $arguments[] = $attributes[$param->name]; diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php index f5502c6f96fa5..5f0419cebefc1 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php @@ -205,12 +205,10 @@ public function testGetVariadicArguments() $resolver = new ControllerResolver(); $request = Request::create('/'); - $param1 = new \stdClass(); - $param2 = new \stdClass(); $request->attributes->set('foo', 'foo'); - $request->attributes->set('bar', array($param1, $param2)); + $request->attributes->set('bar', array('foo', 'bar')); $controller = array(new VariadicController(), 'action'); - $this->assertEquals(array('foo', $param1, $param2), $resolver->getArguments($request, $controller)); + $this->assertEquals(array('foo', 'foo', 'bar'), $resolver->getArguments($request, $controller)); } public function testCreateControllerCanReturnAnyCallable() diff --git a/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php index ebca5c4c1d075..a540f9d1e13e4 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fixtures/Controller/VariadicController.php @@ -4,7 +4,7 @@ class VariadicController { - public function action($foo,...$bar) + public function action($foo, ...$bar) { } }