8000 Replace some container in favor of service locators · symfony/symfony@1f63f2e · GitHub
[go: up one dir, main page]

Skip to content

Commit 1f63f2e

Browse files
committed
Replace some container in favor of service locators
[TwigBundle] Replace container by service locator in ContainerAwareRuntimeLoader [HttpKernel] Replace container by service locator in LazyLoadingFragmentHandler Keep legacy feature working
1 parent 0a3cd97 commit 1f63f2e

File tree

13 files changed

+59
-19
lines changed

13 files changed

+59
-19
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
namespace Symfony\Bundle\FrameworkBundle\EventListener;
1313

14+
use Psr\Container\ContainerInterface;
1415
use Symfony\Component\HttpKernel\EventListener\SessionListener as BaseSessionListener;
15-
use Symfony\Component\DependencyInjection\ContainerInterface;
1616

1717
/**
1818
* Sets the session in the request.

src/Symfony/Bundle/FrameworkBundle/Resources/config/fragment_renderer.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
<services>
1313
<service id="fragment.handler" class="Symfony\Component\HttpKernel\DependencyInjection\LazyLoadingFragmentHandler">
14-
<argument type="service" id="service_container" />
14+
<argument /> <!-- fragment renderer locator -->
1515
<argument type="service" id="request_stack" />
1616
<argument>%kernel.debug%</argument>
1717
</service>

src/Symfony/Bundle/FrameworkBundle/Resources/config/session.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949

5050
<service id="session_listener" class="Symfony\Bundle\FrameworkBundle\EventListener\SessionListener">
5151
<tag name="kernel.event_subscriber" />
52-
<argument type="service" id="service_container" />
52+
<argument type="service-locator">
53+
<argument key="session" type="service" id="session" on-invalid="null" />
54+
</argument>
5355
</service>
5456

5557
<service id="session.save_listener" class="Symfony\Component\HttpKernel\EventListener\SaveSessionListener">

src/Symfony/Bundle/TwigBundle/ContainerAwareRuntimeLoader.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@
1111

1212
namespace Symfony\Bundle\TwigBundle;
1313

14+
@trigger_error(sprintf('The %s class is deprecated since version 3.3 and will be removed in 4.0. Use the Twig_ContainerRuntimeLoader class instead.'), ContainerAwareRuntimeLoader::class);
15+
1416
use Psr\Log\LoggerInterface;
1517
use Symfony\Component\DependencyInjection\ContainerInterface;
1618

1719
/**
1820
* Loads Twig extension runtimes via the service container.
1921
*
2022
* @author Fabien Potencier <fabien@symfony.com>
23+
*
24+
* @deprecated since version 3.3, will be removed in 4.0. Use \Twig_ContainerRuntimeLoader instead.
2125
*/
2226
class ContainerAwareRuntimeLoader implements \Twig_RuntimeLoaderInterface
2327
{

src/Symfony/Bundle/TwigBundle/DependencyInjection/Compiler/RuntimeLoaderPass.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1616
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
17+
use Symfony\Component\DependencyInjection\Reference;
18+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1719

1820
/**
1921
* Registers Twig runtime services.
@@ -39,9 +41,9 @@ public function process(ContainerBuilder $container)
3941
throw new InvalidArgumentException(sprintf('The service "%s" must not be abstract as it can be lazy-loaded.', $id));
4042
}
4143

42-
$mapping[$def->getClass()] = $id;
44+
$mapping[$def->getClass()] = new Reference($id);
4345
}
4446

45-
$definition->replaceArgument(1, $mapping);
47+
$definition->replaceArgument(0, new ServiceLocatorArgument($mapping));
4648
}
4749
}

src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,8 @@
137137
<argument /> <!-- thousands separator, set in TwigExtension -->
138138
</service>
139139

140-
<service id="twig.runtime_loader" class="Symfony\Bundle\TwigBundle\ContainerAwareRuntimeLoader" public="false">
141-
<argument type="service" id="service_container" />
142-
<argument type="collection" /> <!-- the mapping between class names and service names -->
143-
<argument type="service" id="logger" on-invalid="null" />
140+
<service id="twig.runtime_loader" class="Twig_RuntimeLoader" public="false">
141+
<argument /> <!-- runtime locator -->
144142
</service>
145143
</services>
146144
</container>

src/Symfony/Bundle/TwigBundle/Tests/ContainerAwareRuntimeLoaderTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
use Symfony\Component\DependencyInjection\ContainerInterface;
1616
use Symfony\Bundle\TwigBundle\ContainerAwareRuntimeLoader;
1717

18+
/**
19+
* @group legacy
20+
*/
1821
class ContainerAwareRuntimeLoaderTest extends TestCase
1922
{
2023
public function testLoad()

src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ public function testRuntimeLoader()
244244
$container->compile();
245245

246246
$loader = $container->getDefinition('twig.runtime_loader');
247-
$args = $loader->getArgument(1);
247+
$args = $loader->getArgument(0)->getValues();
248248
$this->assertArrayHasKey('Symfony\Bridge\Twig\Form\TwigRenderer', $args);
249249
$this->assertArrayHasKey('FooClass', $args);
250250
$this->assertContains('twig.form.renderer', $args);

src/Symfony/Bundle/TwigBundle/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"symfony/twig-bridge": "^3.2.1",
2222
"symfony/http-foundation": "~2.8|~3.0",
2323
"symfony/http-kernel": "~2.8.16|~3.1.9|^3.2.2",
24-
"twig/twig": "~1.28|~2.0"
24+
"twig/twig": "^1.32|^2.2"
2525
},
2626
"require-dev": {
2727
"symfony/asset": "~2.8|~3.0",

src/Symfony/Component/HttpKernel/DependencyInjection/FragmentRendererPass.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Symfony\Component\DependencyInjection\ContainerBuilder;
1515
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1616
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
17+
use Symfony\Component\DependencyInjection\Reference;
18+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
1719
use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;
1820

1921
/**
@@ -43,6 +45,7 @@ public function process(ContainerBuilder $container)
4345
}
4446

4547
$definition = $container->getDefinition($this->handlerService);
48+
$renderers = array();
4649
foreach ($container->findTaggedServiceIds($this->rendererTag) as $id => $tags) {
4750
$def = $container->getDefinition($id);
4851
if (!$def->isPublic()) {
@@ -63,8 +66,10 @@ public function process(ContainerBuilder $container)
6366
}
6467

6568
foreach ($tags as $tag) {
66-
$definition->addMethodCall('addRendererService', array($tag['alias'], $id));
69+
$renderers[$tag['alias']] = new Reference($id);
6770
}
6871
}
72+
73+
$definition->replaceArgument(0, new ServiceLocatorArgument($renderers));
6974
}
7075
}

src/Symfony/Component/HttpKernel/DependencyInjection/LazyLoadingFragmentHandler.php

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Symfony\Component\HttpKernel\DependencyInjection;
1313

14-
use Symfony\Component\DependencyInjection\ContainerInterface;
14+
use Psr\Container\ContainerInterface;
1515
use Symfony\Component\HttpFoundation\RequestStack;
1616
use Symfony\Component\HttpKernel\Fragment\FragmentHandler;
1717

@@ -23,7 +23,11 @@
2323
class LazyLoadingFragmentHandler extends FragmentHandler
2424
{
2525
private $container;
26+
/**
27+
* @deprecated since version 3.3, to be removed in 4.0
28+
*/
2629
private $rendererIds = array();
30+
private $initialized = array();
2731

2832
/**
2933
* Constructor.
@@ -44,9 +48,13 @@ public function __construct(ContainerInterface $container, RequestStack $request
4448
*
4549
* @param string $name The service name
4650
* @param string $renderer The render service id
51+
*
52+
* @deprecated since version 3.3, to be removed in 4.0
4753
*/
4854
public function addRendererService($name, $renderer)
4955
{
56+
@trigger_error(sprintf('The %s() method is deprecated since version 3.3 and will be removed in 4.0.', __METHOD__), E_USER_DEPRECATED);
57+
5058
$this->rendererIds[$name] = $renderer;
5159
}
5260

@@ -55,10 +63,17 @@ public function addRendererService($name, $renderer)
5563
*/
5664
public function render($uri, $renderer = 'inline', array $options = array())
5765
{
66+
// BC 3.x, to be removed in 4.0
5867
if (isset($this->rendererIds[$renderer])) {
5968
$this->addRenderer($this->container->get($this->rendererIds[$renderer]));
60-
6169
unset($this->rendererIds[$renderer]);
70+
71+
return parent::render($uri, $renderer, $options);
72+
}
73+
74+
if (!isset($this->initialized[$renderer]) && $this->container->has($renderer)) {
75+
$this->addRenderer($this->container->get($renderer));
76+
$this->initialized[$renderer] = true;
6277
}
6378

6479
return parent::render($uri, $renderer, $options);

src/Symfony/Component/HttpKernel/Tests/DependencyInjection/FragmentRendererPassTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpKernel\DependencyInjection\FragmentRendererPass;
1616
use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface;
17+
use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
18+
use Symfony\Component\DependencyInjection\Reference;
1719

1820
class FragmentRendererPassTest extends \PHPUnit_Framework_TestCase
1921
{
@@ -59,9 +61,8 @@ public function testValidContentRenderer()
5961
$renderer = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
6062
$renderer
6163
->expects($this->once())
62-
->method('addMethodCall')
63-
->with('addRendererService', array('foo', 'my_content_renderer'))
64-
;
64+
->method('replaceArgument')
65+
->with(0, $this->equalTo(new ServiceLocatorArgument(array('foo' => new Reference('my_content_renderer')))));
6566

6667
$definition = $this->getMockBuilder('Symfony\Component\DependencyInjection\Definition')->getMock();
6768
$definition->expects($this->atLeastOnce())

src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,25 @@ public function test()
2626
$requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock();
2727
$requestStack->expects($this->any())->method('getCurrentRequest')->will($this->returnValue(Request::create('/')));
2828

29-
$container = $this->getMockBuilder('Symfony\Component\DependencyInjection\ContainerInterface')->getMock();
29+
$container = $this->getMockBuilder('Psr\Container\ContainerInterface')->getMock();
30+
$container->expects($this->once())->method('has')->with('foo')->willReturn(true);
3031
$container->expects($this->once())->method('get')->will($this->returnValue($renderer));
3132

3233
$handler = new LazyLoadingFragmentHandler($container, $requestStack, false);
33-
$handler->addRendererService('foo', 'foo');
3434

3535
$handler->render('/foo', 'foo');
3636

3737
// second call should not lazy-load anymore (see once() above on the get() method)
3838
$handler->render('/foo', 'foo');
3939
}
40+
41+
/**
42+
* @group legacy
43+
* @expectedDeprecation The Symfony\Component\HttpKernel\DependencyInjection\LazyLoadingFragmentHandler::addRendererService() method is deprecated since version 3.3 and will be removed in 4.0.
44+
*/
45+
public function testAddRendererServiceIsDeprecated()
46+
{
47+
$handler = new LazyLoadingFragmentHandler($this->getMockBuilder('Psr\Container\ContainerInterface')->getMock(), $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock());
48+
$handler->addRendererService('foo', 'bar');
49+
}
4050
}

0 commit comments

Comments
 (0)
0