AnalyzeServiceReferencesPassTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Component\DependencyInjection\Tests\Compiler;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
  13. use Symfony\Component\DependencyInjection\Definition;
  14. use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
  15. use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
  16. use Symfony\Component\DependencyInjection\Reference;
  17. use Symfony\Component\DependencyInjection\ContainerBuilder;
  18. class AnalyzeServiceReferencesPassTest extends TestCase
  19. {
  20. public function testProcess()
  21. {
  22. $container = new ContainerBuilder();
  23. $a = $container
  24. ->register('a')
  25. ->addArgument($ref1 = new Reference('b'))
  26. ;
  27. $b = $container
  28. ->register('b')
  29. ->addMethodCall('setA', array($ref2 = new Reference('a')))
  30. ;
  31. $c = $container
  32. ->register('c')
  33. ->addArgument($ref3 = new Reference('a'))
  34. ->addArgument($ref4 = new Reference('b'))
  35. ;
  36. $d = $container
  37. ->register('d')
  38. ->setProperty('foo', $ref5 = new Reference('b'))
  39. ;
  40. $e = $container
  41. ->register('e')
  42. ->setConfigurator(array($ref6 = new Reference('b'), 'methodName'))
  43. ;
  44. $graph = $this->process($container);
  45. $this->assertCount(4, $edges = $graph->getNode('b')->getInEdges());
  46. $this->assertSame($ref1, $edges[0]->getValue());
  47. $this->assertSame($ref4, $edges[1]->getValue());
  48. $this->assertSame($ref5, $edges[2]->getValue());
  49. $this->assertSame($ref6, $edges[3]->getValue());
  50. }
  51. public function testProcessMarksEdgesLazyWhenReferencedServiceIsLazy()
  52. {
  53. $container = new ContainerBuilder();
  54. $container
  55. ->register('a')
  56. ->setLazy(true)
  57. ->addArgument($ref1 = new Reference('b'))
  58. ;
  59. $container
  60. ->register('b')
  61. ->addArgument($ref2 = new Reference('a'))
  62. ;
  63. $graph = $this->process($container);
  64. $this->assertCount(1, $graph->getNode('b')->getInEdges());
  65. $this->assertCount(1, $edges = $graph->getNode('a')->getInEdges());
  66. $this->assertSame($ref2, $edges[0]->getValue());
  67. $this->assertTrue($edges[0]->isLazy());
  68. }
  69. public function testProcessMarksEdgesLazyWhenReferencedFromIteratorArgument()
  70. {
  71. $container = new ContainerBuilder();
  72. $container->register('a');
  73. $container->register('b');
  74. $container
  75. ->register('c')
  76. ->addArgument($ref1 = new Reference('a'))
  77. ->addArgument(new IteratorArgument(array($ref2 = new Reference('b'))))
  78. ;
  79. $graph = $this->process($container);
  80. $this->assertCount(1, $graph->getNode('a')->getInEdges());
  81. $this->assertCount(1, $graph->getNode('b')->getInEdges());
  82. $this->assertCount(2, $edges = $graph->getNode('c')->getOutEdges());
  83. $this->assertSame($ref1, $edges[0]->getValue());
  84. $this->assertFalse($edges[0]->isLazy());
  85. $this->assertSame($ref2, $edges[1]->getValue());
  86. $this->assertTrue($edges[1]->isLazy());
  87. }
  88. public function testProcessDetectsReferencesFromInlinedDefinitions()
  89. {
  90. $container = new ContainerBuilder();
  91. $container
  92. ->register('a')
  93. ;
  94. $container
  95. ->register('b')
  96. ->addArgument(new Definition(null, array($ref = new Reference('a'))))
  97. ;
  98. $graph = $this->process($container);
  99. $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
  100. $this->assertSame($ref, $refs[0]->getValue());
  101. }
  102. public function testProcessDetectsReferencesFromIteratorArguments()
  103. {
  104. $container = new ContainerBuilder();
  105. $container
  106. ->register('a')
  107. ;
  108. $container
  109. ->register('b')
  110. ->addArgument(new IteratorArgument(array($ref = new Reference('a'))))
  111. ;
  112. $graph = $this->process($container);
  113. $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
  114. $this->assertSame($ref, $refs[0]->getValue());
  115. }
  116. public function testProcessDetectsReferencesFromInlinedFactoryDefinitions()
  117. {
  118. $container = new ContainerBuilder();
  119. $container
  120. ->register('a')
  121. ;
  122. $factory = new Definition();
  123. $factory->setFactory(array(new Reference('a'), 'a'));
  124. $container
  125. ->register('b')
  126. ->addArgument($factory)
  127. ;
  128. $graph = $this->process($container);
  129. $this->assertTrue($graph->hasNode('a'));
  130. $this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
  131. }
  132. public function testProcessDoesNotSaveDuplicateReferences()
  133. {
  134. $container = new ContainerBuilder();
  135. $container
  136. ->register('a')
  137. ;
  138. $container
  139. ->register('b')
  140. ->addArgument(new Definition(null, array($ref1 = new Reference('a'))))
  141. ->addArgument(new Definition(null, array($ref2 = new Reference('a'))))
  142. ;
  143. $graph = $this->process($container);
  144. $this->assertCount(2, $graph->getNode('a')->getInEdges());
  145. }
  146. public function testProcessDetectsFactoryReferences()
  147. {
  148. $container = new ContainerBuilder();
  149. $container
  150. ->register('foo', 'stdClass')
  151. ->setFactory(array('stdClass', 'getInstance'));
  152. $container
  153. ->register('bar', 'stdClass')
  154. ->setFactory(array(new Reference('foo'), 'getInstance'));
  155. $graph = $this->process($container);
  156. $this->assertTrue($graph->hasNode('foo'));
  157. $this->assertCount(1, $graph->getNode('foo')->getInEdges());
  158. }
  159. protected function process(ContainerBuilder $container)
  160. {
  161. $pass = new RepeatedPass(array(new AnalyzeServiceReferencesPass()));
  162. $pass->process($container);
  163. return $container->getCompiler()->getServiceReferenceGraph();
  164. }
  165. }