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) { } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy