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

Skip to content

Commit c435c45

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

File tree

11 files changed

+88
-32
lines changed

11 files changed

+88
-32
lines changed

UPGRADE-4.4.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ DependencyInjection
2525
factory: ['@factory_service', method]
2626
```
2727
28+
FrameworkBundle
29+
---------------
30+
31+
* The `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
32+
has been deprecated.
33+
* The `ControllerResolver` and `DelegatingLoader` classes have been marked as `final`.
34+
2835
TwigBridge
2936
----------
3037

UPGRADE-5.0.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ HttpFoundation
236236
use `Symfony\Component\Mime\FileBinaryMimeTypeGuesser` instead.
237237
* The `FileinfoMimeTypeGuesser` class has been removed,
238238
use `Symfony\Component\Mime\FileinfoMimeTypeGuesser` instead.
239+
* The `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
240+
has been removed.
241+
* The `ControllerResolver` and `DelegatingLoader` classes have been made `final`.
239242

240243
HttpKernel
241244
----------

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
CHANGELOG
22
=========
33

4+
4.4.0
5+
-----
6+
7+
* Deprecated the `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
8+
* The `ControllerResolver` and `DelegatingLoader` classes have been marked as `final`
9+
410
4.3.0
511
-----
612

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, bool $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: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,34 @@
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+
/**
33+
* @param LoggerInterface|null $logger
34+
*/
35+
public function __construct(ContainerInterface $container, $logger = null)
2736
{
28-
$this->parser = $parser;
37+
if ($logger instanceof ControllerNameParser) {
38+
@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);
39+
$this->parser = $logger;
40+
$logger = 2 < \func_num_args() ? func_get_arg(2) : null;
41+
} elseif (2 < \func_num_args() && func_get_arg(2) instanceof KernelInterface) {
42+
$this->parser = new ControllerNameParser(func_get_arg(2), false);
43+
} elseif ($logger && !$logger instanceof LoggerInterface) {
44+
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);
45+
}
2946

3047
parent::__construct($container, $logger);
3148
}
@@ -35,10 +52,10 @@ public function __construct(ContainerInterface $container, ControllerNameParser
3552
*/
3653
protected function createController($controller)
3754
{
38-
if (false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
55+
if ($this->parser && false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
3956
// controller in the a:b:c notation then
4057
$deprecatedNotation = $controller;
41-
$controller = $this->parser->parse($deprecatedNotation, false);
58+
$controller = $this->parser->parse($deprecatedNotation);
4259

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

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: 20 additions & 6 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,33 @@
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
35-
* @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
40+
* @param LoaderResolverInterface $resolver
41+
* @param array $defaultOptions
3642
*/
37-
public function __construct(ControllerNameParser $parser, LoaderResolverInterface $resolver, array $defaultOptions = [])
43+
public function __construct($resolver, $defaultOptions = [])
3844
{
39-
$this->parser = $parser;
45+
if ($resolver instanceof ControllerNameParser) {
46+
@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);
47+
$this->parser = $resolver;
48+
$resolver = $defaultOptions;
49+
$defaultOptions = 2 < \func_num_args() ? func_get_arg(2) : [];
50+
} elseif (2 < \func_num_args() && func_get_arg(2) instanceof KernelInterface) {
51+
$this->parser = new ControllerNameParser(func_get_arg(2), false);
52+
}
53+
4054
$this->defaultOptions = $defaultOptions;
4155

4256
parent::__construct($resolver);
@@ -86,11 +100,11 @@ public function load($resource, $type = null)
86100
continue;
87101
}
88102

89-
if (2 === substr_count($controller, ':')) {
103+
if ($this->parser && 2 === substr_count($controller, ':')) {
90104
$deprecatedNotation = $controller;
91105

92106
try {
93-
$controller = $this->parser->parse($controller, false);
107+
$controller = $this->parser->parse($controller);
94108

95109
@trigger_error(sprintf('Referencing controllers with %s is deprecated since Symfony 4.1, use "%s" instead.', $deprecatedNotation, $controller), E_USER_DEPRECATED);
96110
} catch (\InvalidArgumentException $e) {

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)