ResolveBindingsPassTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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\BoundArgument;
  13. use Symfony\Component\DependencyInjection\Compiler\AutowireRequiredMethodsPass;
  14. use Symfony\Component\DependencyInjection\Compiler\ResolveBindingsPass;
  15. use Symfony\Component\DependencyInjection\ContainerBuilder;
  16. use Symfony\Component\DependencyInjection\Reference;
  17. use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy;
  18. use Symfony\Component\DependencyInjection\Tests\Fixtures\ParentNotExists;
  19. use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
  20. use Symfony\Component\DependencyInjection\TypedReference;
  21. require_once __DIR__.'/../Fixtures/includes/autowiring_classes.php';
  22. class ResolveBindingsPassTest extends TestCase
  23. {
  24. public function testProcess()
  25. {
  26. $container = new ContainerBuilder();
  27. $bindings = array(CaseSensitiveClass::class => new BoundArgument(new Reference('foo')));
  28. $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
  29. $definition->setArguments(array(1 => '123'));
  30. $definition->addMethodCall('setSensitiveClass');
  31. $definition->setBindings($bindings);
  32. $container->register('foo', CaseSensitiveClass::class)
  33. ->setBindings($bindings);
  34. $pass = new ResolveBindingsPass();
  35. $pass->process($container);
  36. $this->assertEquals(array(new Reference('foo'), '123'), $definition->getArguments());
  37. $this->assertEquals(array(array('setSensitiveClass', array(new Reference('foo')))), $definition->getMethodCalls());
  38. }
  39. /**
  40. * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
  41. * @expectedExceptionMessage Unused binding "$quz" in service "Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy".
  42. */
  43. public function testUnusedBinding()
  44. {
  45. $container = new ContainerBuilder();
  46. $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
  47. $definition->setBindings(array('$quz' => '123'));
  48. $pass = new ResolveBindingsPass();
  49. $pass->process($container);
  50. }
  51. /**
  52. * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
  53. * @expectedExceptionMessageRegexp Unused binding "$quz" in service [\s\S]+ Invalid service ".*\\ParentNotExists": class NotExists not found\.
  54. */
  55. public function testMissingParent()
  56. {
  57. $container = new ContainerBuilder();
  58. $definition = $container->register(ParentNotExists::class, ParentNotExists::class);
  59. $definition->setBindings(array('$quz' => '123'));
  60. $pass = new ResolveBindingsPass();
  61. $pass->process($container);
  62. }
  63. public function testTypedReferenceSupport()
  64. {
  65. $container = new ContainerBuilder();
  66. $bindings = array(CaseSensitiveClass::class => new BoundArgument(new Reference('foo')));
  67. // Explicit service id
  68. $definition1 = $container->register('def1', NamedArgumentsDummy::class);
  69. $definition1->addArgument($typedRef = new TypedReference('bar', CaseSensitiveClass::class));
  70. $definition1->setBindings($bindings);
  71. $definition2 = $container->register('def2', NamedArgumentsDummy::class);
  72. $definition2->addArgument(new TypedReference(CaseSensitiveClass::class, CaseSensitiveClass::class));
  73. $definition2->setBindings($bindings);
  74. $pass = new ResolveBindingsPass();
  75. $pass->process($container);
  76. $this->assertEquals(array($typedRef), $container->getDefinition('def1')->getArguments());
  77. $this->assertEquals(array(new Reference('foo')), $container->getDefinition('def2')->getArguments());
  78. }
  79. public function testScalarSetter()
  80. {
  81. $container = new ContainerBuilder();
  82. $definition = $container->autowire('foo', ScalarSetter::class);
  83. $definition->setBindings(array('$defaultLocale' => 'fr'));
  84. (new AutowireRequiredMethodsPass())->process($container);
  85. (new ResolveBindingsPass())->process($container);
  86. $this->assertEquals(array(array('setDefaultLocale', array('fr'))), $definition->getMethodCalls());
  87. }
  88. }