From 67c886f3df49a236ef326478565e506002ddd4e1 Mon Sep 17 00:00:00 2001 From: "Johannes M. Schmitt" Date: Tue, 1 Mar 2011 13:44:42 +0100 Subject: [PATCH] [DependencyInjection/Compiler] fixes a bug which silently changed the scope of services --- .../Compiler/InlineServiceDefinitionsPass.php | 14 +++++++++----- .../InlineServiceDefinitionsPassTest.php | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php index 02a07934ccd42..a3b2e45f262d6 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php @@ -37,7 +37,7 @@ public function setRepeatedPass(RepeatedPass $repeatedPass) /** * Processes the ContainerBuilder for inline service definitions. * - * @param ContainerBuilder $container + * @param ContainerBuilder $container */ public function process(ContainerBuilder $container) { @@ -89,9 +89,9 @@ protected function inlineArguments(ContainerBuilder $container, array $arguments /** * Checks if the definition is inlineable. * - * @param ContainerBuilder $container - * @param string $id - * @param Definition $definition + * @param ContainerBuilder $container + * @param string $id + * @param Definition $definition * @return boolean If the definition is inlineable */ protected function isInlinableDefinition(ContainerBuilder $container, $id, Definition $definition) @@ -113,6 +113,10 @@ protected function isInlinableDefinition(ContainerBuilder $container, $id, Defin $ids[] = $edge->getSourceNode()->getId(); } - return count(array_unique($ids)) <= 1; + if (count(array_unique($ids)) > 1) { + return false; + } + + return $container->getDefinition(reset($ids))->getScope() === $definition->getScope(); } } diff --git a/tests/Symfony/Tests/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPassTest.php b/tests/Symfony/Tests/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPassTest.php index b095746c7340e..15a31a4a9c885 100644 --- a/tests/Symfony/Tests/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPassTest.php +++ b/tests/Symfony/Tests/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPassTest.php @@ -11,6 +11,8 @@ namespace Symfony\Tests\Component\DependencyInjection\Compiler; +use Symfony\Component\DependencyInjection\Scope; + use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass; use Symfony\Component\DependencyInjection\Compiler\Compiler; @@ -110,6 +112,20 @@ public function testProcessInlinesIfMultipleReferencesButAllFromTheSameDefinitio $this->assertSame($a, $inlinedArguments[0]); } + public function testProcessInlinesOnlyIfSameScope() + { + $container = new ContainerBuilder(); + + $container->addScope(new Scope('foo')); + $a = $container->register('a')->setPublic(false)->setScope('foo'); + $b = $container->register('b')->addArgument(new Reference('a')); + + $this->process($container); + $arguments = $b->getArguments(); + $this->assertEquals(new Reference('a'), $arguments[0]); + $this->assertTrue($container->hasDefinition('a')); + } + protected function process(ContainerBuilder $container) { $repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new InlineServiceDefinitionsPass()));