[DependencyInjection] inlined factory not referenced
This commit is contained in:
parent
1f55706be9
commit
7816a98204
@ -111,6 +111,10 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
|
|||||||
$this->processArguments($argument->getArguments());
|
$this->processArguments($argument->getArguments());
|
||||||
$this->processArguments($argument->getMethodCalls());
|
$this->processArguments($argument->getMethodCalls());
|
||||||
$this->processArguments($argument->getProperties());
|
$this->processArguments($argument->getProperties());
|
||||||
|
|
||||||
|
if ($argument->getFactoryService()) {
|
||||||
|
$this->processArguments(array(new Reference($argument->getFactoryService())));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,6 +138,10 @@ class InlineServiceDefinitionsPass implements RepeatablePassInterface
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (count($ids) > 1 && $definition->getFactoryService()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return $container->getDefinition(reset($ids))->getScope() === $definition->getScope();
|
return $container->getDefinition(reset($ids))->getScope() === $definition->getScope();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,28 @@ class AnalyzeServiceReferencesPassTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertSame($ref, $refs[0]->getValue());
|
$this->assertSame($ref, $refs[0]->getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testProcessDetectsReferencesFromInlinedFactoryDefinitions()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('a')
|
||||||
|
;
|
||||||
|
|
||||||
|
$factory = new Definition();
|
||||||
|
$factory->setFactoryService('a');
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('b')
|
||||||
|
->addArgument($factory)
|
||||||
|
;
|
||||||
|
|
||||||
|
$graph = $this->process($container);
|
||||||
|
|
||||||
|
$this->assertTrue($graph->hasNode('a'));
|
||||||
|
$this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
|
||||||
|
}
|
||||||
|
|
||||||
public function testProcessDoesNotSaveDuplicateReferences()
|
public function testProcessDoesNotSaveDuplicateReferences()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
|
@ -110,6 +110,84 @@ class InlineServiceDefinitionsPassTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertSame($a, $inlinedArguments[0]);
|
$this->assertSame($a, $inlinedArguments[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testProcessInlinesPrivateFactoryReference()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('a')->setPublic(false);
|
||||||
|
$b = $container
|
||||||
|
->register('b')
|
||||||
|
->setPublic(false)
|
||||||
|
->setFactoryService('a')
|
||||||
|
;
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('foo')
|
||||||
|
->setArguments(array(
|
||||||
|
$ref = new Reference('b'),
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
|
||||||
|
$inlinedArguments = $container->getDefinition('foo')->getArguments();
|
||||||
|
$this->assertSame($b, $inlinedArguments[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testProcessDoesNotInlinePrivateFactoryIfReferencedMultipleTimesWithinTheSameDefinition()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$container
|
||||||
|
->register('a')
|
||||||
|
;
|
||||||
|
$container
|
||||||
|
->register('b')
|
||||||
|
->setPublic(false)
|
||||||
|
->setFactoryService('a')
|
||||||
|
;
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('foo')
|
||||||
|
->setArguments(array(
|
||||||
|
$ref1 = new Reference('b'),
|
||||||
|
$ref2 = new Reference('b'),
|
||||||
|
))
|
||||||
|
;
|
||||||
|
$this->process($container);
|
||||||
|
|
||||||
|
$args = $container->getDefinition('foo')->getArguments();
|
||||||
|
$this->assertSame($ref1, $args[0]);
|
||||||
|
$this->assertSame($ref2, $args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testProcessDoesNotInlineReferenceWhenUsedByInlineFactory()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$container
|
||||||
|
->register('a')
|
||||||
|
;
|
||||||
|
$container
|
||||||
|
->register('b')
|
||||||
|
->setPublic(false)
|
||||||
|
->setFactoryService('a')
|
||||||
|
;
|
||||||
|
|
||||||
|
$inlineFactory = new Definition();
|
||||||
|
$inlineFactory->setPublic(false);
|
||||||
|
$inlineFactory->setFactoryService('b');
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('foo')
|
||||||
|
->setArguments(array(
|
||||||
|
$ref = new Reference('b'),
|
||||||
|
$inlineFactory,
|
||||||
|
))
|
||||||
|
;
|
||||||
|
$this->process($container);
|
||||||
|
|
||||||
|
$args = $container->getDefinition('foo')->getArguments();
|
||||||
|
$this->assertSame($ref, $args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
public function testProcessInlinesOnlyIfSameScope()
|
public function testProcessInlinesOnlyIfSameScope()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
|
Reference in New Issue
Block a user