Skip to content

Commit 83f02cd

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

File tree

11 files changed

+86
-30
lines changed

11 files changed

+86
-30
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, $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 <fabien@symfony.com>
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 = func_get_arg(2);
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 (false === strpos($controller, '::') && 2 === substr_count($controller, ':') && $this->parser) {
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: 18 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,33 @@
2324
* to the fully-qualified form (from a:b:c to class::method).
2425
*
2526
* @author Fabien Potencier <fabien@symfony.com>
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
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,7 +100,7 @@ public function load($resource, $type = null)
86100
continue;
87101
}
88102

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

92106
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();

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