*/
-class TraceableControllerResolver implements ControllerResolverInterface
+class TraceableControllerResolver implements ControllerResolverInterface, ArgumentResolverInterface
{
private $resolver;
private $stopwatch;
+ private $argumentResolver;
/**
* Constructor.
*
- * @param ControllerResolverInterface $resolver A ControllerResolverInterface instance
- * @param Stopwatch $stopwatch A Stopwatch instance
+ * @param ControllerResolverInterface $resolver A ControllerResolverInterface instance
+ * @param Stopwatch $stopwatch A Stopwatch instance
+ * @param ArgumentResolverInterface $argumentResolver Only required for BC
*/
- public function __construct(ControllerResolverInterface $resolver, Stopwatch $stopwatch)
+ public function __construct(ControllerResolverInterface $resolver, Stopwatch $stopwatch, ArgumentResolverInterface $argumentResolver = null)
{
$this->resolver = $resolver;
$this->stopwatch = $stopwatch;
+ $this->argumentResolver = $argumentResolver;
+
+ if (null === $this->argumentResolver) {
+ $this->argumentResolver = $resolver;
+ }
}
/**
@@ -52,12 +59,20 @@ public function getController(Request $request)
/**
* {@inheritdoc}
+ *
+ * @deprecated This method is deprecated as of 3.1 and will be removed in 4.0.
*/
public function getArguments(Request $request, $controller)
{
+ @trigger_error(sprintf('This %s method is deprecated as of 3.1 and will be removed in 4.0. Please use the %s instead.', __METHOD__, TraceableArgumentResolver::class), E_USER_DEPRECATED);
+
+ if ($this->argumentResolver instanceof TraceableArgumentResolver) {
+ return $this->argumentResolver->getArguments($request, $controller);
+ }
+
$e = $this->stopwatch->start('controller.get_arguments');
- $ret = $this->resolver->getArguments($request, $controller);
+ $ret = $this->argumentResolver->getArguments($request, $controller);
$e->stop();
diff --git a/src/Symfony/Component/HttpKernel/HttpKernel.php b/src/Symfony/Component/HttpKernel/HttpKernel.php
index 1600b2ce591d..c9b1d65227f4 100644
--- a/src/Symfony/Component/HttpKernel/HttpKernel.php
+++ b/src/Symfony/Component/HttpKernel/HttpKernel.php
@@ -11,6 +11,8 @@
namespace Symfony\Component\HttpKernel;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
@@ -36,19 +38,28 @@ class HttpKernel implements HttpKernelInterface, TerminableInterface
protected $dispatcher;
protected $resolver;
protected $requestStack;
+ private $argumentResolver;
/**
* Constructor.
*
- * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
- * @param ControllerResolverInterface $resolver A ControllerResolverInterface instance
- * @param RequestStack $requestStack A stack for master/sub requests
+ * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance
+ * @param ControllerResolverInterface $resolver A ControllerResolverInterface instance
+ * @param RequestStack $requestStack A stack for master/sub requests
+ * @param ArgumentResolverInterface $argumentResolver An ArgumentResolverInterface instance
*/
- public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null)
+ public function __construct(EventDispatcherInterface $dispatcher, ControllerResolverInterface $resolver, RequestStack $requestStack = null, ArgumentResolverInterface $argumentResolver = null)
{
$this->dispatcher = $dispatcher;
$this->resolver = $resolver;
$this->requestStack = $requestStack ?: new RequestStack();
+ $this->argumentResolver = $argumentResolver;
+
+ if (null === $this->argumentResolver) {
+ @trigger_error(sprintf('As of 3.1 an %s is used to resolve arguments. In 4.0 the $argumentResolver becomes mandatory and the %s can no longer be used to resolve arguments.', ArgumentResolverInterface::class, ControllerResolverInterface::class), E_USER_DEPRECATED);
+ // fallback in case of deprecations
+ $this->argumentResolver = $resolver;
+ }
}
/**
@@ -133,7 +144,7 @@ private function handleRaw(Request $request, $type = self::MASTER_REQUEST)
$controller = $event->getController();
// controller arguments
- $arguments = $this->resolver->getArguments($request, $controller);
+ $arguments = $this->argumentResolver->getArguments($request, $controller);
// call controller
$response = call_user_func_array($controller, $arguments);
diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php
new file mode 100644
index 000000000000..4945b8a1a10a
--- /dev/null
+++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php
@@ -0,0 +1,137 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Tests\Controller;
+
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
+use Symfony\Component\HttpKernel\Controller\ControllerResolver;
+use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
+use Symfony\Component\HttpFoundation\Request;
+
+class ArgumentResolverTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @group legacy
+ */
+ public function testGetArguments()
+ {
+ $resolver = new ArgumentResolver();
+
+ $request = Request::create('/');
+ $controller = array(new self(), 'testGetArguments');
+ $this->assertEquals(array(), $resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = array(new self(), 'controllerMethod1');
+ $this->assertEquals(array('foo'), $resolver->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = array(new self(), 'controllerMethod2');
+ $this->assertEquals(array('foo', null), $resolver->getArguments($request, $controller), '->getArguments() uses default values if present');
+
+ $request->attributes->set('bar', 'bar');
+ $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes');
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = function ($foo) {};
+ $this->assertEquals(array('foo'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = function ($foo, $bar = 'bar') {};
+ $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $controller = new self();
+ $this->assertEquals(array('foo', null), $resolver->getArguments($request, $controller));
+ $request->attributes->set('bar', 'bar');
+ $this->assertEquals(array('foo', 'bar'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('foobar', 'foobar');
+ $controller = 'Symfony\Component\HttpKernel\Tests\Controller\another_controller_function';
+ $this->assertEquals(array('foo', 'foobar'), $resolver->getArguments($request, $controller));
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('foobar', 'foobar');
+ $controller = array(new self(), 'controllerMethod3');
+
+ try {
+ $resolver->getArguments($request, $controller);
+ $this->fail('->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
+ } catch (\Exception $e) {
+ $this->assertInstanceOf('\RuntimeException', $e, '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value');
+ }
+
+ $request = Request::create('/');
+ $controller = array(new self(), 'controllerMethod5');
+ $this->assertEquals(array($request), $resolver->getArguments($request, $controller), '->getArguments() injects the request');
+ }
+
+ /**
+ * @requires PHP 5.6
+ * @group legacy
+ */
+ public function testGetVariadicArguments()
+ {
+ $resolver = new ControllerResolver();
+
+ $request = Request::create('/');
+ $request->attributes->set('foo', 'foo');
+ $request->attributes->set('bar', array('foo', 'bar'));
+ $controller = array(new VariadicController(), 'action');
+ $this->assertEquals(array('foo', 'foo', 'bar'), $resolver->getArguments($request, $controller));
+ }
+
+ public function testCreateControllerCanReturnAnyCallable()
+ {
+ $mock = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolver', array('createController'));
+ $mock->expects($this->once())->method('createController')->will($this->returnValue('Symfony\Component\HttpKernel\Tests\Controller\another_controller_function'));
+
+ $request = Request::create('/');
+ $request->attributes->set('_controller', 'foobar');
+ $mock->getController($request);
+ }
+
+ public function __invoke($foo, $bar = null)
+ {
+ }
+
+ public function controllerMethod1($foo)
+ {
+ }
+
+ protected function controllerMethod2($foo, $bar = null)
+ {
+ }
+
+ protected function controllerMethod3($foo, $bar, $foobar)
+ {
+ }
+
+ protected static function controllerMethod4()
+ {
+ }
+
+ protected function controllerMethod5(Request $request)
+ {
+ }
+}
+
+function another_controller_function($foo, $foobar)
+{
+}
diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php
index 7ba1ff6e451d..1e5fde618aa9 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php
@@ -137,6 +137,9 @@ public function getUndefinedControllers()
);
}
+ /**
+ * @group legacy
+ */
public function testGetArguments()
{
$resolver = $this->createControllerResolver();
@@ -200,6 +203,7 @@ public function testGetArguments()
/**
* @requires PHP 5.6
+ * @group legacy
*/
public function testGetVariadicArguments()
{
diff --git a/src/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php b/src/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php
index f64d7247c0b4..5894ffbb8d74 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Debug/TraceableEventDispatcherTest.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\HttpKernel\Tests\Debug;
use Symfony\Component\EventDispatcher\EventDispatcher;
+use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Debug\TraceableEventDispatcher;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpFoundation\Request;
@@ -108,10 +109,11 @@ public function testListenerCanRemoveItselfWhenExecuted()
protected function getHttpKernel($dispatcher, $controller)
{
- $resolver = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface');
- $resolver->expects($this->once())->method('getController')->will($this->returnValue($controller));
- $resolver->expects($this->once())->method('getArguments')->will($this->returnValue(array()));
+ $controllerResolver = $this->getMock('Symfony\Component\HttpKernel\Controller\ControllerResolverInterface');
+ $controllerResolver->expects($this->once())->method('getController')->will($this->returnValue($controller));
+ $argumentResolver = $this->getMock('Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface');
+ $argumentResolver->expects($this->once())->method('getArguments')->will($this->returnValue(array()));
- return new HttpKernel($dispatcher, $resolver);
+ return new HttpKernel($dispatcher, $controllerResolver, new RequestStack(), $argumentResolver);
}
}
diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php
index 4e487a478a60..ee25b8316749 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php
@@ -11,6 +11,8 @@
namespace Symfony\Component\HttpKernel\Tests\Fragment;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
use Symfony\Component\HttpKernel\Controller\ControllerReference;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
@@ -60,7 +62,7 @@ public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController(
}))
;
- $kernel = new HttpKernel(new EventDispatcher(), $resolver);
+ $kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver());
$renderer = new InlineFragmentRenderer($kernel);
$response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));
@@ -142,8 +144,8 @@ private function getKernelExpectingRequest(Request $request)
public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
{
- $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
- $resolver
+ $controllerResolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
+ $controllerResolver
->expects($this->once())
->method('getController')
->will($this->returnValue(function () {
@@ -152,13 +154,15 @@ public function testExceptionInSubRequestsDoesNotMangleOutputBuffers()
throw new \RuntimeException();
}))
;
- $resolver
+
+ $argumentResolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ArgumentResolverInterface');
+ $argumentResolver
->expects($this->once())
->method('getArguments')
->will($this->returnValue(array()))
;
- $kernel = new HttpKernel(new EventDispatcher(), $resolver);
+ $kernel = new HttpKernel(new EventDispatcher(), $controllerResolver, new RequestStack(), $argumentResolver);
$renderer = new InlineFragmentRenderer($kernel);
// simulate a main request with output buffering
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