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

Skip to content

Commit e7ac670

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

File tree

11 files changed

+93
-23
lines changed

11 files changed

+93
-23
lines changed

UPGRADE-4.4.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ 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+
* The `controller_name_converter` and `resolve_controller_name_subscriber` services shave been deprecated.
35+
2836
MonologBridge
2937
--------------
3038

@@ -34,4 +42,4 @@ TwigBridge
3442
----------
3543

3644
* Deprecated to pass `$rootDir` and `$fileLinkFormatter` as 5th and 6th argument respectively to the
37-
`DebugCommand::__construct()` method, swap the variables position.
45+
`DebugCommand::__construct()` method, swap the variables position.

UPGRADE-5.0.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ FrameworkBundle
219219
* Removed support for legacy translations directories `src/Resources/translations/` and `src/Resources/<BundleName>/translations/`, use `translations/` instead.
220220
* Support for the legacy directory structure in `translation:update` and `debug:translation` commands has been removed.
221221
* Removed the "Psr\SimpleCache\CacheInterface" / "cache.app.simple" service, use "Symfony\Contracts\Cache\CacheInterface" / "cache.app" instead.
222+
* The `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
223+
has been removed.
224+
* The `ControllerResolver` and `DelegatingLoader` classes have been made `final`.
225+
* The `controller_name_converter` and `resolve_controller_name_subscriber` services have been removed.
226+
222227

223228
HttpFoundation
224229
--------------

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

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

4+
4.4.0
5+
-----
6+
7+
* Deprecated the `$parser` argument of `ControllerResolver::__construct()` and `DelegatingLoader::__construct()`
8+
* Deprecated the `controller_name_converter` and `resolve_controller_name_subscriber` services
9+
* The `ControllerResolver` and `DelegatingLoader` classes have been marked as `final`
10+
411
4.3.0
512
-----
613

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

Lines changed: 6 additions & 2 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
/**
@@ -93,7 +97,7 @@ public function parse($controller)
9397
*/
9498
public function build($controller)
9599
{
96-
@trigger_error(sprintf('The %s class is deprecated since Symfony 4.1.', __CLASS__), E_USER_DEPRECATED);
100+
@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.1.', __CLASS__), E_USER_DEPRECATED);
97101

98102
if (0 === preg_match('#^(.*?\\\\Controller\\\\(.+)Controller)::(.+)Action$#', $controller, $match)) {
99103
throw new \InvalidArgumentException(sprintf('The "%s" controller is not a valid "class::method" string.', $controller));

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,30 @@
1818

1919
/**
2020
* @author Fabien Potencier <[email protected]>
21+
*
22+
* @final since Symfony 4.4
2123
*/
2224
class ControllerResolver extends ContainerControllerResolver
2325
{
26+
/**
27+
* @deprecated since Symfony 4.4
28+
*/
2429
protected $parser;
2530

26-
public function __construct(ContainerInterface $container, ControllerNameParser $parser, LoggerInterface $logger = null)
31+
/**
32+
* @param LoggerInterface|null $logger
33+
*/
34+
public function __construct(ContainerInterface $container, $logger = null)
2735
{
28-
$this->parser = $parser;
36+
if ($logger instanceof ControllerNameParser) {
37+
@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);
38+
$this->parser = $logger;
39+
$logger = 2 < \func_num_args() ? func_get_arg(2) : null;
40+
} elseif (2 < \func_num_args() && func_get_arg(2) instanceof ControllerNameParser) {
41+
$this->parser = func_get_arg(2);
42+
} elseif ($logger && !$logger instanceof LoggerInterface) {
43+
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);
44+
}
2945

3046
parent::__construct($container, $logger);
3147
}
@@ -35,7 +51,7 @@ public function __construct(ContainerInterface $container, ControllerNameParser
3551
*/
3652
protected function createController($controller)
3753
{
38-
if (false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
54+
if ($this->parser && false === strpos($controller, '::') && 2 === substr_count($controller, ':')) {
3955
// controller in the a:b:c notation then
4056
$deprecatedNotation = $controller;
4157
$controller = $this->parser->parse($deprecatedNotation, false);

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,12 @@ class ResolveControllerNameSubscriber implements EventSubscriberInterface
2727
{
2828
private $parser;
2929

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

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="controller_name_converter" /> <!-- 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: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@
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+
<argument>false</argument>
1314
</service>
1415

16+
<service id="bclayer" alias="controller_name_converter" />
17+
1518
<service id="controller_resolver" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver">
1619
<tag name="monolog.logger" channel="request" />
1720
<argument type="service" id="service_container" />
18-
<argument type="service" id="controller_name_converter" />
1921
<argument type="service" id="logger" on-invalid="ignore" />
22+
<argument type="service" id="bclayer" /> <!-- deprecated since Symfony 4.4 -->
2023
</service>
2124

2225
<service id="argument_metadata_factory" class="Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory" />
@@ -83,6 +86,7 @@
8386

8487
<service id="resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
8588
<argument type="service" id="controller_name_converter" />
89+
<argument>false</argument>
8690
<tag name="kernel.event_subscriber" />
8791
</service>
8892
<service id="disallow_search_engine_index_response_listener" class="Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener">

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,33 @@
2323
* to the fully-qualified form (from a:b:c to class::method).
2424
*
2525
* @author Fabien Potencier <[email protected]>
26+
*
27+
* @final since Symfony 4.4
2628
*/
2729
class DelegatingLoader extends BaseDelegatingLoader
2830
{
31+
/**
32+
* @deprecated since Symfony 4.4
33+
*/
2934
protected $parser;
3035
private $loading = false;
3136
private $defaultOptions;
3237

3338
/**
34-
* @param ControllerNameParser $parser A ControllerNameParser instance
35-
* @param LoaderResolverInterface $resolver A LoaderResolverInterface instance
39+
* @param LoaderResolverInterface $resolver
40+
* @param array $defaultOptions
3641
*/
37-
public function __construct(ControllerNameParser $parser, LoaderResolverInterface $resolver, array $defaultOptions = [])
42+
public function __construct($resolver, $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 ControllerNameParser) {
50+
$this->parser = func_get_arg(2);
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 ($this->parser && 2 === substr_count($controller, ':')) {
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
->willReturn('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)