RemoveUnusedDefinitionsPassTest.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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\Compiler\AnalyzeServiceReferencesPass;
  13. use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
  14. use Symfony\Component\DependencyInjection\Compiler\RemoveUnusedDefinitionsPass;
  15. use Symfony\Component\DependencyInjection\Compiler\ResolveParameterPlaceHoldersPass;
  16. use Symfony\Component\DependencyInjection\Definition;
  17. use Symfony\Component\DependencyInjection\Reference;
  18. use Symfony\Component\DependencyInjection\ContainerBuilder;
  19. class RemoveUnusedDefinitionsPassTest extends TestCase
  20. {
  21. public function testProcess()
  22. {
  23. $container = new ContainerBuilder();
  24. $container
  25. ->register('foo')
  26. ->setPublic(false)
  27. ;
  28. $container
  29. ->register('bar')
  30. ->setPublic(false)
  31. ;
  32. $container
  33. ->register('moo')
  34. ->setArguments(array(new Reference('bar')))
  35. ;
  36. $this->process($container);
  37. $this->assertFalse($container->hasDefinition('foo'));
  38. $this->assertTrue($container->hasDefinition('bar'));
  39. $this->assertTrue($container->hasDefinition('moo'));
  40. }
  41. public function testProcessRemovesUnusedDefinitionsRecursively()
  42. {
  43. $container = new ContainerBuilder();
  44. $container
  45. ->register('foo')
  46. ->setPublic(false)
  47. ;
  48. $container
  49. ->register('bar')
  50. ->setArguments(array(new Reference('foo')))
  51. ->setPublic(false)
  52. ;
  53. $this->process($container);
  54. $this->assertFalse($container->hasDefinition('foo'));
  55. $this->assertFalse($container->hasDefinition('bar'));
  56. }
  57. public function testProcessWorksWithInlinedDefinitions()
  58. {
  59. $container = new ContainerBuilder();
  60. $container
  61. ->register('foo')
  62. ->setPublic(false)
  63. ;
  64. $container
  65. ->register('bar')
  66. ->setArguments(array(new Definition(null, array(new Reference('foo')))))
  67. ;
  68. $this->process($container);
  69. $this->assertTrue($container->hasDefinition('foo'));
  70. $this->assertTrue($container->hasDefinition('bar'));
  71. }
  72. public function testProcessWontRemovePrivateFactory()
  73. {
  74. $container = new ContainerBuilder();
  75. $container
  76. ->register('foo', 'stdClass')
  77. ->setFactory(array('stdClass', 'getInstance'))
  78. ->setPublic(false);
  79. $container
  80. ->register('bar', 'stdClass')
  81. ->setFactory(array(new Reference('foo'), 'getInstance'))
  82. ->setPublic(false);
  83. $container
  84. ->register('foobar')
  85. ->addArgument(new Reference('bar'));
  86. $this->process($container);
  87. $this->assertTrue($container->hasDefinition('foo'));
  88. $this->assertTrue($container->hasDefinition('bar'));
  89. $this->assertTrue($container->hasDefinition('foobar'));
  90. }
  91. public function testProcessConsiderEnvVariablesAsUsedEvenInPrivateServices()
  92. {
  93. $container = new ContainerBuilder();
  94. $container->setParameter('env(FOOBAR)', 'test');
  95. $container
  96. ->register('foo')
  97. ->setArguments(array('%env(FOOBAR)%'))
  98. ->setPublic(false)
  99. ;
  100. $resolvePass = new ResolveParameterPlaceHoldersPass();
  101. $resolvePass->process($container);
  102. $this->process($container);
  103. $this->assertFalse($container->hasDefinition('foo'));
  104. $envCounters = $container->getEnvCounters();
  105. $this->assertArrayHasKey('FOOBAR', $envCounters);
  106. $this->assertSame(1, $envCounters['FOOBAR']);
  107. }
  108. protected function process(ContainerBuilder $container)
  109. {
  110. $repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new RemoveUnusedDefinitionsPass()));
  111. $repeatedPass->process($container);
  112. }
  113. }