From 8c447680b970949a4a63520de3bcabbbf044075c Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Sat, 20 Apr 2013 22:07:10 +0200 Subject: [PATCH] [HttpKernel] allowed any callable to be returned by ControllerResolver::createController --- .../HttpKernel/Controller/ControllerResolver.php | 8 ++++---- .../Tests/Controller/ControllerResolverTest.php | 10 ++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php index bbe7746734..047ade1062 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php +++ b/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php @@ -76,13 +76,13 @@ class ControllerResolver implements ControllerResolverInterface } } - list($controller, $method) = $this->createController($controller); + $callable = $this->createController($controller); - if (!method_exists($controller, $method)) { - throw new \InvalidArgumentException(sprintf('Method "%s::%s" does not exist.', get_class($controller), $method)); + if (!is_callable($callable)) { + throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable.', $request->getPathInfo())); } - return array($controller, $method); + return $callable; } /** diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php index c19af8216d..aa401f44d6 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php @@ -150,6 +150,16 @@ class ControllerResolverTest extends \PHPUnit_Framework_TestCase $this->assertEquals(array($request), $resolver->getArguments($request, $controller), '->getArguments() injects the request'); } + 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\some_controller_function')); + + $request = Request::create('/'); + $request->attributes->set('_controller', 'foobar'); + $mock->getController($request); + } + public function __invoke($foo, $bar = null) { }