InlineServiceDefinitionsPassTest.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.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\Tests\Component\DependencyInjection\Compiler;
  11. use Symfony\Component\DependencyInjection\Definition;
  12. use Symfony\Component\DependencyInjection\Compiler\AnalyzeServiceReferencesPass;
  13. use Symfony\Component\DependencyInjection\Compiler\Compiler;
  14. use Symfony\Component\DependencyInjection\Compiler\RepeatedPass;
  15. use Symfony\Component\DependencyInjection\Compiler\InlineServiceDefinitionsPass;
  16. use Symfony\Component\DependencyInjection\Reference;
  17. use Symfony\Component\DependencyInjection\ContainerBuilder;
  18. class InlineServiceDefinitionsPassTest extends \PHPUnit_Framework_TestCase
  19. {
  20. public function testProcess()
  21. {
  22. $container = new ContainerBuilder();
  23. $container
  24. ->register('inlinable.service')
  25. ->setPublic(false)
  26. ;
  27. $container
  28. ->register('service')
  29. ->setArguments(array(new Reference('inlinable.service')))
  30. ;
  31. $this->process($container);
  32. $arguments = $container->getDefinition('service')->getArguments();
  33. $this->assertInstanceOf('Symfony\Component\DependencyInjection\Definition', $arguments[0]);
  34. $this->assertSame($container->getDefinition('inlinable.service'), $arguments[0]);
  35. }
  36. public function testProcessDoesNotInlineWhenAliasedServiceIsNotOfPrototypeScope()
  37. {
  38. $container = new ContainerBuilder();
  39. $container
  40. ->register('foo')
  41. ->setPublic(false)
  42. ;
  43. $container->setAlias('moo', 'foo');
  44. $container
  45. ->register('service')
  46. ->setArguments(array($ref = new Reference('foo')))
  47. ;
  48. $this->process($container);
  49. $arguments = $container->getDefinition('service')->getArguments();
  50. $this->assertSame($ref, $arguments[0]);
  51. }
  52. public function testProcessDoesInlineServiceOfPrototypeScope()
  53. {
  54. $container = new ContainerBuilder();
  55. $container
  56. ->register('foo')
  57. ->setScope('prototype')
  58. ;
  59. $container
  60. ->register('bar')
  61. ->setPublic(false)
  62. ->setScope('prototype')
  63. ;
  64. $container->setAlias('moo', 'bar');
  65. $container
  66. ->register('service')
  67. ->setArguments(array(new Reference('foo'), $ref = new Reference('moo'), new Reference('bar')))
  68. ;
  69. $this->process($container);
  70. $arguments = $container->getDefinition('service')->getArguments();
  71. $this->assertEquals($container->getDefinition('foo'), $arguments[0]);
  72. $this->assertNotSame($container->getDefinition('foo'), $arguments[0]);
  73. $this->assertSame($ref, $arguments[1]);
  74. $this->assertEquals($container->getDefinition('bar'), $arguments[2]);
  75. $this->assertNotSame($container->getDefinition('bar'), $arguments[2]);
  76. }
  77. public function testProcessInlinesIfMultipleReferencesButAllFromTheSameDefinition()
  78. {
  79. $container = new ContainerBuilder();
  80. $a = $container->register('a')->setPublic(false);
  81. $b = $container
  82. ->register('b')
  83. ->addArgument(new Reference('a'))
  84. ->addArgument(new Definition(null, array(new Reference('a'))))
  85. ;
  86. $this->process($container);
  87. $arguments = $b->getArguments();
  88. $this->assertSame($a, $arguments[0]);
  89. $inlinedArguments = $arguments[1]->getArguments();
  90. $this->assertSame($a, $inlinedArguments[0]);
  91. }
  92. protected function process(ContainerBuilder $container)
  93. {
  94. $repeatedPass = new RepeatedPass(array(new AnalyzeServiceReferencesPass(), new InlineServiceDefinitionsPass()));
  95. $repeatedPass->process($container);
  96. }
  97. }