Skip to content

Commit 67c886f

Browse files
committed
[DependencyInjection/Compiler] fixes a bug which silently changed the scope of services
1 parent 57d0d3f commit 67c886f

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

src/Symfony/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPass.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public function setRepeatedPass(RepeatedPass $repeatedPass)
3737
/**
3838
* Processes the ContainerBuilder for inline service definitions.
3939
*
40-
* @param ContainerBuilder $container
40+
* @param ContainerBuilder $container
4141
*/
4242
public function process(ContainerBuilder $container)
4343
{
@@ -89,9 +89,9 @@ protected function inlineArguments(ContainerBuilder $container, array $arguments
8989
/**
9090
* Checks if the definition is inlineable.
9191
*
92-
* @param ContainerBuilder $container
93-
* @param string $id
94-
* @param Definition $definition
92+
* @param ContainerBuilder $container
93+
* @param string $id
94+
* @param Definition $definition
9595
* @return boolean If the definition is inlineable
9696
*/
9797
protected function isInlinableDefinition(ContainerBuilder $container, $id, Definition $definition)
@@ -113,6 +113,10 @@ protected function isInlinableDefinition(ContainerBuilder $container, $id, Defin
113113
$ids[] = $edge->getSourceNode()->getId();
114114
}
115115

116-
return count(array_unique($ids)) <= 1;
116+
if (count(array_unique($ids)) > 1) {
117+
return false;
118+
}
119+
120+
return $container->getDefinition(reset($ids))->getScope() === $definition->getScope();
117121
}
118122
}

tests/Symfony/Tests/Component/DependencyInjection/Compiler/InlineServiceDefinitionsPassTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Tests\Component\DependencyInjection\Compiler;
1313

14+
use Symfony\Component\DependencyInjection\Scope;
15+
1416
use Symfony\Component\DependencyInjection\Definition;
1517
use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
1618
use Symfony\Component\DependencyInjection\Compiler\Compiler;
@@ -110,6 +112,20 @@ public function testProcessInlinesIfMultipleReferencesButAllFromTheSameDefinitio
110112
$this->assertSame($a, $inlinedArguments[0]);
111113
}
112114

115+
public function testProcessInlinesOnlyIfSameScope()
116+
{
117+
$container = new ContainerBuilder();
118+
119+
$container->addScope(new Scope('foo'));
120+
$a = $container->register('a')->setPublic(false)->setScope('foo');
121+
$b = $container->register('b')->addArgument(new Reference('a'));
122+
123+
$this->process($container);
124+
$arguments = $b->getArguments();
125+
$this->assertEquals(new Reference('a'), $arguments[0]);
126+
$this->assertTrue($container->hasDefinition('a'));
127+
}
128+
113129
protected function process(ContainerBuilder $container)
114130
{
115131
$repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new InlineServiceDefinitionsPass()));

0 commit comments

Comments
 (0)