[HttpKernel] Resolve real class when failing on proxies

This commit is contained in:
Robin Chalas 2017-03-13 09:26:31 +01:00
parent 40d133c29a
commit e34e29a621
2 changed files with 22 additions and 0 deletions

View File

@ -12,6 +12,7 @@
namespace Symfony\Component\HttpKernel\Controller;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\LazyProxy\InheritanceProxyInterface;
use Symfony\Component\HttpFoundation\Request;
/**
@ -234,6 +235,10 @@ class ControllerResolver implements ArgumentResolverInterface, ControllerResolve
$className = is_object($controller) ? get_class($controller) : $controller;
if (is_subclass_of($className, InheritanceProxyInterface::class)) {
$className = get_parent_class($className);
}
if (method_exists($controller, $method)) {
return sprintf('Method "%s" on class "%s" should be public and non-abstract.', $method, $className);
}

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\HttpKernel\Tests\Controller;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\LazyProxy\InheritanceProxyInterface;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
@ -277,6 +278,18 @@ class ControllerResolverTest extends TestCase
$this->assertEquals(array(null, null, 'value', 'mandatory'), $resolver->getArguments($request, $controller));
}
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The controller for URI "/" is not callable. Method "protectedAction" on class "Symfony\Component\HttpKernel\Tests\Controller\ControllerTest" should be public and non-abstract.
*/
public function testGetControllerFailsUsingParentClassForProxies()
{
$resolver = new ControllerResolver();
$request = Request::create('/');
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerProxy::protectedAction');
$resolver->getController($request);
}
protected function createControllerResolver(LoggerInterface $logger = null)
{
return new ControllerResolver($logger);
@ -329,3 +342,7 @@ class ControllerTest
{
}
}
class ControllerProxy extends ControllerTest implements InheritanceProxyInterface
{
}