Skip to content

Commit 2466e1d

Browse files
author
Robin Chalas
committed
[FrameworkBundle] Add missing BC layer for deprecated ControllerNameParser injections
1 parent 47fd08e commit 2466e1d

File tree

8 files changed

+66
-30
lines changed

8 files changed

+66
-30
lines changed

src/Symfony/Bundle/FrameworkBundle/Controller/ControllerNameParser.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,13 @@ class ControllerNameParser
2727
{
2828
protected $kernel;
2929

30-
public function __construct(KernelInterface $kernel)
30+
public function __construct(KernelInterface $kernel, $triggerDeprecation = true)
3131
{
3232
$this->kernel = $kernel;
33+
34+
if ($triggerDeprecation) {
35+
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1.', __CLASS__), E_USER_DEPRECATED);
36+
}
3337
}
3438

3539
/**
@@ -44,10 +48,6 @@ public function __construct(KernelInterface $kernel)
4448
*/
4549
public function parse($controller)
4650
{
47-
if (2 > \func_num_args() || func_get_arg(1)) {
48-
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1.', __CLASS__), E_USER_DEPRECATED);
49-
}
50-
5151
$parts = explode(':', $controller);
5252
if (3 !== \count($parts) || \in_array('', $parts, true)) {
5353
throw new \InvalidArgumentException(sprintf('The "%s" controller is not a valid "a:b:c" controller string.', $controller));
@@ -93,8 +93,6 @@ public function parse($controller)
9393
*/
9494
public function build($controller)
9595
{
96-
@trigger_error(sprintf('The %s class is deprecated since Symfony 4.1.', __CLASS__), E_USER_DEPRECATED);
97-
9896
if (0 === preg_match('#^(.*?\\\\Controller\\\\(.+)Controller)::(.+)Action$#', $controller, $match)) {
9997
throw new \InvalidArgumentException(sprintf('The "%s" controller is not a valid "class::method" string.', $controller));
10098
}

src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,31 @@
1515
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
1616
use Symfony\Component\DependencyInjection\ContainerInterface;
1717
use Symfony\Component\HttpKernel\Controller\ContainerControllerResolver;
18+
use Symfony\Component\HttpKernel\KernelInterface;
1819

1920
/**
2021
* @author Fabien Potencier <fabien@symfony.com>
22+
*
23+
* @final since Symfony 4.4
2124
*/
2225
class ControllerResolver extends ContainerControllerResolver
2326
{
27+
/**
28+
* @deprecated since Symfony 4.4
29+
*/
2430
protected $parser;
2531

26-
public function __construct(ContainerInterface $container, ControllerNameParser $parser, LoggerInterface $logger = null)
32+
public function __construct(ContainerInterface $container, /* LoggerInterface */ $logger = null)
2733
{
28-
$this->parser = $parser;
34+
if ($logger instanceof ControllerNameParser) {
35+
@trigger_error(sprintf('Passing a "%s" instance as 2nd argument to "%s()" is deprecated since Symfony 4.4, pass a "%s" instance or null instead.', ControllerNameParser::class, __METHOD__, LoggerInterface::class), E_USER_DEPRECATED);
36+
$this->parser = $logger;
37+
$logger = func_get_arg(2);
38+
} elseif (2 < func_num_args() && func_get_arg(2) instanceof KernelInterface) {
39+
$this->parser = new ControllerNameParser(func_get_arg(2), false);
40+
} elseif ($logger && !$logger instanceof LoggerInterface) {
41+
throw new \TypeError(sprintf('Argument 2 of "%s()" must be an instance of "%s" or null, "%s" given.', __METHOD__, LoggerInterface::class, \is_object($logger) ? \get_class($logger) : \gettype($logger)), E_USER_DEPRECATED);
42+
}
2943

3044
parent::__construct($container, $logger);
3145
}
@@ -35,10 +49,10 @@ public function __construct(ContainerInterface $container, ControllerNameParser
3549
*/
3650
protected function createController($controller)
3751
{
38-
if (false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
52+
if (false === strpos($controller, '::') && 2 === substr_count($controller, ':') && $this->parser) {
3953
// controller in the a:b:c notation then
4054
$deprecatedNotation = $controller;
41-
$controller = $this->parser->parse($deprecatedNotation, false);
55+
$controller = $this->parser->parse($deprecatedNotation);
4256

4357
@trigger_error(sprintf('Referencing controllers with %s is deprecated since Symfony 4.1. Use %s instead.', $deprecatedNotation, $controller), E_USER_DEPRECATED);
4458
}

src/Symfony/Bundle/FrameworkBundle/EventListener/ResolveControllerNameSubscriber.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1616
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1717
use Symfony\Component\HttpKernel\KernelEvents;
18+
use Symfony\Component\HttpKernel\KernelInterface;
1819

1920
/**
2021
* Guarantees that the _controller key is parsed into its final format.
@@ -27,17 +28,17 @@ class ResolveControllerNameSubscriber implements EventSubscriberInterface
2728
{
2829
private $parser;
2930

30-
public function __construct(ControllerNameParser $parser)
31+
public function __construct($parser)
3132
{
32-
$this->parser = $parser;
33+
$this->parser = $parser instanceof KernelInterface ? new ControllerNameParser($parser, false) : $parser;
3334
}
3435

3536
public function onKernelRequest(GetResponseEvent $event)
3637
{
3738
$controller = $event->getRequest()->attributes->get('_controller');
3839
if (\is_string($controller) && false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
3940
// controller in the a:b:c notation then
40-
$event->getRequest()->attributes->set('_controller', $parsedNotation = $this->parser->parse($controller, false));
41+
$event->getRequest()->attributes->set('_controller', $parsedNotation = $this->parser->parse($controller));
4142

4243
@trigger_error(sprintf('Referencing controllers with %s is deprecated since Symfony 4.1, use "%s" instead.', $controller, $parsedNotation), E_USER_DEPRECATED);
4344
}

src/Symfony/Bundle/FrameworkBundle/Resources/config/routing.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@
4646
</service>
4747

4848
<service id="routing.loader" class="Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader" public="true">
49-
<argument type="service" id="controller_name_converter" />
5049
<argument type="service" id="routing.resolver" />
5150
<argument type="collection" />
51+
<argument type="service" id="kernel" /><!-- deprecated since Symfony 4.4 -->
5252
</service>
5353

5454
<service id="router.default" class="Symfony\Bundle\FrameworkBundle\Routing\Router">

src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@
1010
<service id="controller_name_converter" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser">
1111
<tag name="monolog.logger" channel="request" />
1212
<argument type="service" id="kernel" />
13+
<deprecated>The "%service_id%" service is deprecated since Symfony 4.4.</deprecated>
1314
</service>
1415

1516
<service id="controller_resolver" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver">
1617
<tag name="monolog.logger" channel="request" />
1718
<argument type="service" id="service_container" />
18-
<argument type="service" id="controller_name_converter" />
1919
<argument type="service" id="logger" on-invalid="ignore" />
20+
<argument type="service" id="kernel" /> <!-- deprecated since Symfony 4.4 -->
2021
</service>
2122

2223
<service id="argument_metadata_factory" class="Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory" />
@@ -82,7 +83,7 @@
8283
</service>
8384

8485
<service id="resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
85-
<argument type="service" id="controller_name_converter" />
86+
<argument type="service" id="kernel" />
8687
<tag name="kernel.event_subscriber" />
8788
</service>
8889
<service id="disallow_search_engine_index_response_listener" class="Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener">

src/Symfony/Bundle/FrameworkBundle/Routing/DelegatingLoader.php

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Config\Exception\LoaderLoadException;
1616
use Symfony\Component\Config\Loader\DelegatingLoader as BaseDelegatingLoader;
1717
use Symfony\Component\Config\Loader\LoaderResolverInterface;
18+
use Symfony\Component\HttpKernel\KernelInterface;
1819

1920
/**
2021
* DelegatingLoader delegates route loading to other loaders using a loader resolver.
@@ -23,20 +24,32 @@
2324
* to the fully-qualified form (from a:b:c to class::method).
2425
*
2526
* @author Fabien Potencier <fabien@symfony.com>
27+
*
28+
* @final since Symfony 4.4
2629
*/
2730
class DelegatingLoader extends BaseDelegatingLoader
2831
{
32+
/**
33+
* @deprecated since Symfony 4.4
34+
*/
2935
protected $parser;
3036
private $loading = false;
3137
private $defaultOptions;
3238

3339
/**
34-
* @param ControllerNameParser $parser A ControllerNameParser instance
3540
* @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
3641
*/
37-
public function __construct(ControllerNameParser $parser, LoaderResolverInterface $resolver, array $defaultOptions = [])
42+
public function __construct(/* LoaderResolverInterface */ $resolver, /* array */ $defaultOptions = [])
3843
{
39-
$this->parser = $parser;
44+
if ($resolver instanceof ControllerNameParser) {
45+
@trigger_error(sprintf('Passing a "%s" instance as first argument to "%s()" is deprecated since Symfony 4.4, pass a "%s" instance instead.', ControllerNameParser::class, __METHOD__, LoaderResolverInterface::class), E_USER_DEPRECATED);
46+
$this->parser = $resolver;
47+
$resolver = $defaultOptions;
48+
$defaultOptions = 2 < func_num_args() ? func_get_arg(2) : [];
49+
} elseif (2 < func_num_args() && func_get_arg(2) instanceof KernelInterface) {
50+
$this->parser = new ControllerNameParser(func_get_arg(2), false);
51+
}
52+
4053
$this->defaultOptions = $defaultOptions;
4154

4255
parent::__construct($resolver);
@@ -86,7 +99,7 @@ public function load($resource, $type = null)
8699
continue;
87100
}
88101

89-
if (2 === substr_count($controller, ':')) {
102+
if (2 === substr_count($controller, ':') && $this->parser) {
90103
$deprecatedNotation = $controller;
91104

92105
try {

src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerResolverTest.php

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function testGetControllerWithBundleNotation()
6363
->will($this->returnValue('Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController::testAction'))
6464
;
6565

66-
$resolver = $this->createControllerResolver(null, null, $parser);
66+
$resolver = $this->createLegacyControllerResolver(null, null, $parser);
6767
$request = Request::create('/');
6868
$request->attributes->set('_controller', $shortName);
6969

@@ -105,7 +105,7 @@ class_exists(AbstractControllerTest::class);
105105
$container = new Container();
106106
$container->set(TestAbstractController::class, $controller);
107107

108-
$resolver = $this->createControllerResolver(null, $container);
108+
$resolver = $this->createLegacyControllerResolver(null, $container);
109109

110110
$request = Request::create('/');
111111
$request->attributes->set('_controller', TestAbstractController::class.'::fooAction');
@@ -127,7 +127,7 @@ class_exists(AbstractControllerTest::class);
127127
$container = new Container();
128128
$container->set(DummyController::class, $controller);
129129

130-
$resolver = $this->createControllerResolver(null, $container);
130+
$resolver = $this->createLegacyControllerResolver(null, $container);
131131

132132
$request = Request::create('/');
133133
$request->attributes->set('_controller', DummyController::class.'::fooAction');
@@ -176,7 +176,7 @@ class_exists(AbstractControllerTest::class);
176176
$this->assertSame($controllerContainer, $controller->getContainer());
177177
}
178178

179-
protected function createControllerResolver(LoggerInterface $logger = null, Psr11ContainerInterface $container = null, ControllerNameParser $parser = null)
179+
protected function createLegacyControllerResolver(LoggerInterface $logger = null, Psr11ContainerInterface $container = null, ControllerNameParser $parser = null)
180180
{
181181
if (!$parser) {
182182
$parser = $this->createMockParser();
@@ -189,6 +189,15 @@ protected function createControllerResolver(LoggerInterface $logger = null, Psr1
189189
return new ControllerResolver($container, $parser, $logger);
190190
}
191191

192+
protected function createControllerResolver(LoggerInterface $logger = null, Psr11ContainerInterface $container = null)
193+
{
194+
if (!$container) {
195+
$container = $this->createMockContainer();
196+
}
197+
198+
return new ControllerResolver($container, $logger);
199+
}
200+
192201
protected function createMockParser()
193202
{
194203
return $this->getMockBuilder('Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser')->disableOriginalConstructor()->getMock();

src/Symfony/Bundle/FrameworkBundle/Tests/Routing/DelegatingLoaderTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313

1414
class DelegatingLoaderTest extends TestCase
1515
{
16+
/**
17+
* @group legacy
18+
* @expectedDeprecation Passing a "Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser" instance as first argument to "Symfony\Bundle\FrameworkBundle\Routing\DelegatingLoader::__construct()" is deprecated since Symfony 4.4, pass a "Symfony\Component\Config\Loader\LoaderResolverInterface" instance instead.
19+
*/
1620
public function testConstructorApi()
1721
{
1822
$controllerNameParser = $this->getMockBuilder(ControllerNameParser::class)
@@ -24,10 +28,6 @@ public function testConstructorApi()
2428

2529
public function testLoadDefaultOptions()
2630
{
27-
$controllerNameParser = $this->getMockBuilder(ControllerNameParser::class)
28-
->disableOriginalConstructor()
29-
->getMock();
30-
3131
$loaderResolver = $this->getMockBuilder(LoaderResolverInterface::class)
3232
->disableOriginalConstructor()
3333
->getMock();
@@ -46,7 +46,7 @@ public function testLoadDefaultOptions()
4646
->method('load')
4747
->willReturn($routeCollection);
4848

49-
$delegatingLoader = new DelegatingLoader($controllerNameParser, $loaderResolver, ['utf8' => true]);
49+
$delegatingLoader = new DelegatingLoader($loaderResolver, ['utf8' => true]);
5050

5151
$loadedRouteCollection = $delegatingLoader->load('foo');
5252
$this->assertCount(2, $loadedRouteCollection);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy