浏览代码

[HttpKernel] ControllerResolver arguments reflection for Closure object.

When controller is a Closure ControllerResolver::getArguments tries to
make a ReflectionMethod of the __invoke method. But because it's an
internal function, the parameters method isDefaultValueAvailable will
return always false, even if isOptional return true.
Juan M Martínez 13 年之前
父节点
当前提交
61e0bdebf8
共有 1 个文件被更改,包括 6 次插入2 次删除
  1. 6 2
      src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php

+ 6 - 2
src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php

@@ -96,8 +96,12 @@ class ControllerResolver implements ControllerResolverInterface
         if (is_array($controller)) {
             $r = new \ReflectionMethod($controller[0], $controller[1]);
         } elseif (is_object($controller)) {
-            $r = new \ReflectionObject($controller);
-            $r = $r->getMethod('__invoke');
+            if ($controller instanceof \Closure) {
+                $r = new \ReflectionFunction($controller);
+            } else {
+                $r = new \ReflectionObject($controller);
+                $r = $r->getMethod('__invoke');
+            }
         } else {
             $r = new \ReflectionFunction($controller);
         }