[HttpKernel] Resolve real class when failing on proxies
This commit is contained in:
parent
40d133c29a
commit
e34e29a621
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
}
|
||||
|
Reference in New Issue
Block a user