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

Skip to content

Commit 097856e

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 097856e

File tree

13 files changed

+59
-19
lines changed
  • src/Symfony
    • Bundle
      • FrameworkBundle
        • EventListener
  • Resources/config
  • TwigBundle
  • Component/HttpKernel
  • 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 "Twig_ContainerRuntimeLoader" 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 10000 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.29|^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