bug #11639 [DependencyInjection] Fixed factory service not within the ServiceReferenceGraph. (boekkooi)
This PR was submitted for the master branch but it was merged into the 2.3 branch instead (closes #11639).
Discussion
----------
[DependencyInjection] Fixed factory service not within the ServiceReferenceGraph.
| Q | A
| ------------- | ---
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets |
| License | MIT
| Doc PR |
Fixed a problem where Factory services are not added to the ServiceReferenceGraph.
Commits
-------
e992f8e
Fixed Factory services not within the ServiceReferenceGraph.
This commit is contained in:
commit
c59f1dde6b
@ -69,7 +69,11 @@ class AnalyzeServiceReferencesPass implements RepeatablePassInterface
|
|||||||
|
|
||||||
$this->currentId = $id;
|
$this->currentId = $id;
|
||||||
$this->currentDefinition = $definition;
|
$this->currentDefinition = $definition;
|
||||||
|
|
||||||
$this->processArguments($definition->getArguments());
|
$this->processArguments($definition->getArguments());
|
||||||
|
if ($definition->getFactoryService()) {
|
||||||
|
$this->processArguments(array(new Reference($definition->getFactoryService())));
|
||||||
|
}
|
||||||
|
|
||||||
if (!$this->onlyConstructorArguments) {
|
if (!$this->onlyConstructorArguments) {
|
||||||
$this->processArguments($definition->getMethodCalls());
|
$this->processArguments($definition->getMethodCalls());
|
||||||
|
@ -97,6 +97,26 @@ class AnalyzeServiceReferencesPassTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertCount(2, $graph->getNode('a')->getInEdges());
|
$this->assertCount(2, $graph->getNode('a')->getInEdges());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testProcessDetectsFactoryReferences()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('foo', 'stdClass')
|
||||||
|
->setFactoryClass('stdClass')
|
||||||
|
->setFactoryMethod('getInstance');
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('bar', 'stdClass')
|
||||||
|
->setFactoryService('foo')
|
||||||
|
->setFactoryMethod('getInstance');
|
||||||
|
|
||||||
|
$graph = $this->process($container);
|
||||||
|
|
||||||
|
$this->assertTrue($graph->hasNode('foo'));
|
||||||
|
$this->assertCount(1, $graph->getNode('foo')->getInEdges());
|
||||||
|
}
|
||||||
|
|
||||||
protected function process(ContainerBuilder $container)
|
protected function process(ContainerBuilder $container)
|
||||||
{
|
{
|
||||||
$pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass()));
|
$pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass()));
|
||||||
|
@ -48,6 +48,26 @@ class CheckCircularReferencesPassTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->process($container);
|
$this->process($container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
|
||||||
|
*/
|
||||||
|
public function testProcessWithFactory()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('a', 'stdClass')
|
||||||
|
->setFactoryService('b')
|
||||||
|
->setFactoryMethod('getInstance');
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('b', 'stdClass')
|
||||||
|
->setFactoryService('a')
|
||||||
|
->setFactoryMethod('getInstance');
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
|
||||||
*/
|
*/
|
||||||
@ -61,6 +81,25 @@ class CheckCircularReferencesPassTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->process($container);
|
$this->process($container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
|
||||||
|
*/
|
||||||
|
public function testProcessDetectsIndirectCircularReferenceWithFactory()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container->register('a')->addArgument(new Reference('b'));
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('b', 'stdClass')
|
||||||
|
->setFactoryService('c')
|
||||||
|
->setFactoryMethod('getInstance');
|
||||||
|
|
||||||
|
$container->register('c')->addArgument(new Reference('a'));
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
|
||||||
*/
|
*/
|
||||||
|
@ -81,6 +81,33 @@ class RemoveUnusedDefinitionsPassTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertTrue($container->hasDefinition('bar'));
|
$this->assertTrue($container->hasDefinition('bar'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testProcessWontRemovePrivateFactory()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('foo', 'stdClass')
|
||||||
|
->setFactoryClass('stdClass')
|
||||||
|
->setFactoryMethod('getInstance')
|
||||||
|
->setPublic(false);
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('bar', 'stdClass')
|
||||||
|
->setFactoryService('foo')
|
||||||
|
->setFactoryMethod('getInstance')
|
||||||
|
->setPublic(false);
|
||||||
|
|
||||||
|
$container
|
||||||
|
->register('foobar')
|
||||||
|
->addArgument(new Reference('bar'));
|
||||||
|
|
||||||
|
$this->process($container);
|
||||||
|
|
||||||
|
$this->assertTrue($container->hasDefinition('foo'));
|
||||||
|
$this->assertTrue($container->hasDefinition('bar'));
|
||||||
|
$this->assertTrue($container->hasDefinition('foobar'));
|
||||||
|
}
|
||||||
|
|
||||||
protected function process(ContainerBuilder $container)
|
protected function process(ContainerBuilder $container)
|
||||||
{
|
{
|
||||||
$repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new RemoveUnusedDefinitionsPass()));
|
$repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new RemoveUnusedDefinitionsPass()));
|
||||||
|
Reference in New Issue
Block a user