Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aee1887

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

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 <[email protected]>
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 <[email protected]>
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)