Skip to content

Commit 1f37275

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

File tree

12 files changed

+103
-24
lines changed

12 files changed

+103
-24
lines changed

UPGRADE-4.4.md

Lines changed: 8 additions & 0 deletions
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 have been deprecated.
35+
2836
Messenger
2937
---------
3038

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: 5 additions & 1 deletion
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
/**

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__), E_USER_DEPRECATED);
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=".legacy_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: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@
77
<services>
88
<defaults public="false" />
99

10-
<service id="controller_name_converter" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser">
10+
<service id=".legacy_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>
14+
</service>
15+
16+
<service id="controller_name_converter" alias=".legacy_controller_name_converter">
17+
<deprecated>The "%alias_id%" service is deprecated since Symfony 4.3.</deprecated>
1318
</service>
1419

1520
<service id="controller_resolver" class="Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver">
1621
<tag name="monolog.logger" channel="request" />
1722
<argument type="service" id="service_container" />
18-
<argument type="service" id="controller_name_converter" />
1923
<argument type="service" id="logger" on-invalid="ignore" />
24+
<argument type="service" id=".legacy_controller_name_converter" />
2025
</service>
2126

2227
<service id="argument_metadata_factory" class="Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory" />
@@ -81,10 +86,15 @@
8186
<tag name="kernel.event_subscriber" />
8287
</service>
8388

84-
<service id="resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
85-
<argument type="service" id="controller_name_converter" />
89+
<service id=".legacy_resolve_controller_name_subscriber" class="Symfony\Bundle\FrameworkBundle\EventListener\ResolveControllerNameSubscriber">
90+
<argument type="service" id=".legacy_controller_name_converter" />
91+
<argument>false</argument>
8692
<tag name="kernel.event_subscriber" />
8793
</service>
94+
<service id="resolve_controller_name_subscriber" alias=".legacy_resolve_controller_name_subscriber">
95+
<deprecated>The "%alias_id%" service is deprecated since Symfony 4.3.</deprecated>
96+
</service>
97+
8898
<service id="disallow_search_engine_index_response_listener" class="Symfony\Component\HttpKernel\EventListener\DisallowRobotsIndexingListener">
8999
<tag name="kernel.event_subscriber" />
90100
</service>

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