[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;
|
namespace Symfony\Component\HttpKernel\Controller;
|
||||||
|
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\LazyProxy\InheritanceProxyInterface;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -234,6 +235,10 @@ class ControllerResolver implements ArgumentResolverInterface, ControllerResolve
|
|||||||
|
|
||||||
$className = is_object($controller) ? get_class($controller) : $controller;
|
$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)) {
|
if (method_exists($controller, $method)) {
|
||||||
return sprintf('Method "%s" on class "%s" should be public and non-abstract.', $method, $className);
|
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 PHPUnit\Framework\TestCase;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\LazyProxy\InheritanceProxyInterface;
|
||||||
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
|
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
|
||||||
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
|
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController;
|
||||||
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
|
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));
|
$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)
|
protected function createControllerResolver(LoggerInterface $logger = null)
|
||||||
{
|
{
|
||||||
return new ControllerResolver($logger);
|
return new ControllerResolver($logger);
|
||||||
@ -329,3 +342,7 @@ class ControllerTest
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ControllerProxy extends ControllerTest implements InheritanceProxyInterface
|
||||||
|
{
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user