From 6c109c71a9c181211932a058f2f6c7275144f593 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Fri, 7 Jun 2019 18:20:29 +0200 Subject: [PATCH] [FrameworkBundle] fix FC with HttpKernel v5 --- .../ResolveControllerNameSubscriber.php | 22 ++++++++++++++++--- .../ResolveControllerNameSubscriberTest.php | 16 +++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/EventListener/ResolveControllerNameSubscriber.php b/src/Symfony/Bundle/FrameworkBundle/EventListener/ResolveControllerNameSubscriber.php index 1964be1b4b..169c032779 100644 --- a/src/Symfony/Bundle/FrameworkBundle/EventListener/ResolveControllerNameSubscriber.php +++ b/src/Symfony/Bundle/FrameworkBundle/EventListener/ResolveControllerNameSubscriber.php @@ -13,7 +13,7 @@ namespace Symfony\Bundle\FrameworkBundle\EventListener; use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser; use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\HttpKernel\Event\GetResponseEvent; +use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\KernelEvents; /** @@ -21,6 +21,8 @@ use Symfony\Component\HttpKernel\KernelEvents; * * @author Ryan Weaver * + * @method onKernelRequest(RequestEvent $event) + * * @deprecated since Symfony 4.1 */ class ResolveControllerNameSubscriber implements EventSubscriberInterface @@ -36,8 +38,22 @@ class ResolveControllerNameSubscriber implements EventSubscriberInterface $this->parser = $parser; } - public function onKernelRequest(GetResponseEvent $event) + /** + * @internal + */ + public function resolveControllerName(...$args) { + $this->onKernelRequest(...$args); + } + + public function __call(string $method, array $args) + { + if ('onKernelRequest' !== $method && 'onKernelRequest' !== strtolower($method)) { + throw new \Error(sprintf('Error: Call to undefined method %s::%s()', \get_class($this), $method)); + } + + $event = $args[0]; + $controller = $event->getRequest()->attributes->get('_controller'); if (\is_string($controller) && false === strpos($controller, '::') && 2 === substr_count($controller, ':')) { // controller in the a:b:c notation then @@ -50,7 +66,7 @@ class ResolveControllerNameSubscriber implements EventSubscriberInterface public static function getSubscribedEvents() { return [ - KernelEvents::REQUEST => ['onKernelRequest', 24], + KernelEvents::REQUEST => ['resolveControllerName', 24], ]; } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/EventListener/ResolveControllerNameSubscriberTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/EventListener/ResolveControllerNameSubscriberTest.php index 4d9acb9911..362f00e95c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/EventListener/ResolveControllerNameSubscriberTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/EventListener/ResolveControllerNameSubscriberTest.php @@ -15,6 +15,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser; use Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber; use Symfony\Bundle\FrameworkBundle\Tests\TestCase; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; @@ -23,9 +24,6 @@ use Symfony\Component\HttpKernel\HttpKernelInterface; */ class ResolveControllerNameSubscriberTest extends TestCase { - /** - * @group legacy - */ public function testReplacesControllerAttribute() { $parser = $this->getMockBuilder(ControllerNameParser::class)->disableOriginalConstructor()->getMock(); @@ -41,6 +39,10 @@ class ResolveControllerNameSubscriberTest extends TestCase $subscriber = new ResolveControllerNameSubscriber($parser); $subscriber->onKernelRequest(new RequestEvent($httpKernel, $request, HttpKernelInterface::MASTER_REQUEST)); $this->assertEquals('App\\Final\\Format::methodName', $request->attributes->get('_controller')); + + $subscriber = new ChildResolveControllerNameSubscriber($parser); + $subscriber->onKernelRequest(new RequestEvent($httpKernel, $request, HttpKernelInterface::MASTER_REQUEST)); + $this->assertEquals('App\\Final\\Format::methodName', $request->attributes->get('_controller')); } /** @@ -67,3 +69,11 @@ class ResolveControllerNameSubscriberTest extends TestCase yield [function () {}]; } } + +class ChildResolveControllerNameSubscriber extends ResolveControllerNameSubscriber +{ + public function onKernelRequest(GetResponseEvent $event) + { + parent::onKernelRequest($event); + } +}