浏览代码

[HttpKernel] fixed ControllerResolver when the controller is a class name with an __invoke() method

Fabien Potencier 13 年之前
父节点
当前提交
be031f54a1

+ 5 - 1
src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php

@@ -64,10 +64,14 @@ class ControllerResolver implements ControllerResolverInterface
             return false;
         }
 
-        if (is_array($controller) || ((is_object($controller) || false === strpos($controller, ':')) && method_exists($controller, '__invoke'))) {
+        if (is_array($controller) || (is_object($controller) && method_exists($controller, '__invoke'))) {
             return $controller;
         }
 
+        if (false === strpos($controller, ':') && method_exists($controller, '__invoke')) {
+            return new $controller;
+        }
+
         list($controller, $method) = $this->createController($controller);
 
         if (!method_exists($controller, $method)) {

+ 4 - 0
tests/Symfony/Tests/Component/HttpKernel/Controller/ControllerResolverTest.php

@@ -39,6 +39,10 @@ class ControllerResolverTest extends \PHPUnit_Framework_TestCase
         $controller = $resolver->getController($request);
         $this->assertSame($this, $controller);
 
+        $request->attributes->set('_controller', 'Symfony\Tests\Component\HttpKernel\ControllerResolverTest');
+        $controller = $resolver->getController($request);
+        $this->assertInstanceOf('Symfony\Tests\Component\HttpKernel\ControllerResolverTest', $controller);
+
         $request->attributes->set('_controller', array($this, 'controllerMethod1'));
         $controller = $resolver->getController($request);
         $this->assertSame(array($this, 'controllerMethod1'), $controller);