ResettableServicePassTest.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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\HttpKernel\Tests\DependencyInjection;
  11. use PHPUnit\Framework\TestCase;
  12. use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
  13. use Symfony\Component\DependencyInjection\ContainerBuilder;
  14. use Symfony\Component\DependencyInjection\ContainerInterface;
  15. use Symfony\Component\DependencyInjection\Exception\RuntimeException;
  16. use Symfony\Component\DependencyInjection\Reference;
  17. use Symfony\Component\HttpKernel\DependencyInjection\ResettableServicePass;
  18. use Symfony\Component\HttpKernel\DependencyInjection\ServicesResetter;
  19. use Symfony\Component\HttpKernel\Tests\Fixtures\ClearableService;
  20. use Symfony\Component\HttpKernel\Tests\Fixtures\MultiResettableService;
  21. use Symfony\Component\HttpKernel\Tests\Fixtures\ResettableService;
  22. class ResettableServicePassTest extends TestCase
  23. {
  24. public function testCompilerPass()
  25. {
  26. $container = new ContainerBuilder();
  27. $container->register('one', ResettableService::class)
  28. ->setPublic(true)
  29. ->addTag('kernel.reset', ['method' => 'reset']);
  30. $container->register('two', ClearableService::class)
  31. ->setPublic(true)
  32. ->addTag('kernel.reset', ['method' => 'clear']);
  33. $container->register('three', MultiResettableService::class)
  34. ->setPublic(true)
  35. ->addTag('kernel.reset', ['method' => 'resetFirst'])
  36. ->addTag('kernel.reset', ['method' => 'resetSecond']);
  37. $container->register('services_resetter', ServicesResetter::class)
  38. ->setPublic(true)
  39. ->setArguments([null, []]);
  40. $container->addCompilerPass(new ResettableServicePass());
  41. $container->compile();
  42. $definition = $container->getDefinition('services_resetter');
  43. $this->assertEquals(
  44. [
  45. new IteratorArgument([
  46. 'one' => new Reference('one', ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE),
  47. 'two' => new Reference('two', ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE),
  48. 'three' => new Reference('three', ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE),
  49. ]),
  50. [
  51. 'one' => ['reset'],
  52. 'two' => ['clear'],
  53. 'three' => ['resetFirst', 'resetSecond'],
  54. ],
  55. ],
  56. $definition->getArguments()
  57. );
  58. }
  59. public function testMissingMethod()
  60. {
  61. $this->expectException(RuntimeException::class);
  62. $this->expectExceptionMessage('Tag "kernel.reset" requires the "method" attribute to be set.');
  63. $container = new ContainerBuilder();
  64. $container->register(ResettableService::class)
  65. ->addTag('kernel.reset');
  66. $container->register('services_resetter', ServicesResetter::class)
  67. ->setArguments([null, []]);
  68. $container->addCompilerPass(new ResettableServicePass());
  69. $container->compile();
  70. }
  71. public function testIgnoreInvalidMethod()
  72. {
  73. $container = new ContainerBuilder();
  74. $container->register(ResettableService::class)
  75. ->setPublic(true)
  76. ->addTag('kernel.reset', ['method' => 'missingMethod', 'on_invalid' => 'ignore']);
  77. $container->register('services_resetter', ServicesResetter::class)
  78. ->setPublic(true)
  79. ->setArguments([null, []]);
  80. $container->addCompilerPass(new ResettableServicePass());
  81. $container->compile();
  82. $this->assertSame([ResettableService::class => ['?missingMethod']], $container->getDefinition('services_resetter')->getArgument(1));
  83. $resettable = $container->get(ResettableService::class);
  84. $resetter = $container->get('services_resetter');
  85. $resetter->reset();
  86. }
  87. public function testCompilerPassWithoutResetters()
  88. {
  89. $container = new ContainerBuilder();
  90. $container->register('services_resetter', ServicesResetter::class)
  91. ->setArguments([null, []]);
  92. $container->addCompilerPass(new ResettableServicePass());
  93. $container->compile();
  94. $this->assertFalse($container->has('services_resetter'));
  95. }
  96. }