Skip to content

Commit fac9377

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

File tree

11 files changed

+91
-23
lines changed

11 files changed

+91
-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 <fabien@symfony.com>
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: 3 additions & 1 deletion
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+
<argument>false</argument>
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="bclayer" /> <!-- deprecated since Symfony 4.4 -->
2021
</service>
2122

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

8485
<service id="resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
8586
<argument type="service" id="controller_name_converter" />
87+
<argument>false</argument>
8688
<tag name="kernel.event_subscriber" />
8789
</service>
8890
<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 <fabien@symfony.com>
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();

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