Loading core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php +6 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ use Drupal\Component\Serialization\Exception\InvalidDataTypeException; use Drupal\Core\Serialization\Yaml; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\ContainerInterface; Loading Loading @@ -492,6 +493,11 @@ private function resolveServices(mixed $value): mixed return $argument; } if ($value->getTag() === 'service_closure') { return new ServiceClosureArgument($this->resolveServices($argument)); } } if (is_array($value)) { $value = array_map(array($this, 'resolveServices'), $value); Loading core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php +12 −0 Original line number Diff line number Diff line Loading @@ -9,7 +9,9 @@ use Drupal\Core\DependencyInjection\YamlFileLoader; use Drupal\Tests\UnitTestCase; use org\bovigo\vfs\vfsStream; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\Reference; /** * @coversDefaultClass \Drupal\Core\DependencyInjection\YamlFileLoader Loading Loading @@ -39,6 +41,9 @@ class: \Drupal\Core\ExampleClass example_tagged_iterator: class: \Drupal\Core\ExampleClass arguments: [!tagged_iterator foo.bar]" example_service_closure: class: \Drupal\Core\ExampleClass arguments: [!service_closure '@example_service_1']" YAML; vfsStream::setup('drupal', NULL, [ Loading @@ -63,6 +68,13 @@ class: \Drupal\Core\ExampleClass $this->assertTrue($builder->has('Drupal\Core\ExampleClass')); $this->assertSame('Drupal\Core\ExampleClass', $builder->getDefinition('Drupal\Core\ExampleClass')->getClass()); $this->assertInstanceOf(TaggedIteratorArgument::class, $builder->getDefinition('example_tagged_iterator')->getArgument(0)); // Test service closures. $service_closure = $builder->getDefinition('example_service_closure')->getArgument(0); $this->assertInstanceOf(ServiceClosureArgument::class, $service_closure); $ref = $service_closure->getValues()[0]; $this->assertInstanceOf(Reference::class, $ref); $this->assertEquals('example_service_1', $ref); } /** Loading Loading
core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php +6 −0 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ use Drupal\Component\Serialization\Exception\InvalidDataTypeException; use Drupal\Core\Serialization\Yaml; use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\ContainerInterface; Loading Loading @@ -492,6 +493,11 @@ private function resolveServices(mixed $value): mixed return $argument; } if ($value->getTag() === 'service_closure') { return new ServiceClosureArgument($this->resolveServices($argument)); } } if (is_array($value)) { $value = array_map(array($this, 'resolveServices'), $value); Loading
core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php +12 −0 Original line number Diff line number Diff line Loading @@ -9,7 +9,9 @@ use Drupal\Core\DependencyInjection\YamlFileLoader; use Drupal\Tests\UnitTestCase; use org\bovigo\vfs\vfsStream; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; use Symfony\Component\DependencyInjection\Reference; /** * @coversDefaultClass \Drupal\Core\DependencyInjection\YamlFileLoader Loading Loading @@ -39,6 +41,9 @@ class: \Drupal\Core\ExampleClass example_tagged_iterator: class: \Drupal\Core\ExampleClass arguments: [!tagged_iterator foo.bar]" example_service_closure: class: \Drupal\Core\ExampleClass arguments: [!service_closure '@example_service_1']" YAML; vfsStream::setup('drupal', NULL, [ Loading @@ -63,6 +68,13 @@ class: \Drupal\Core\ExampleClass $this->assertTrue($builder->has('Drupal\Core\ExampleClass')); $this->assertSame('Drupal\Core\ExampleClass', $builder->getDefinition('Drupal\Core\ExampleClass')->getClass()); $this->assertInstanceOf(TaggedIteratorArgument::class, $builder->getDefinition('example_tagged_iterator')->getArgument(0)); // Test service closures. $service_closure = $builder->getDefinition('example_service_closure')->getArgument(0); $this->assertInstanceOf(ServiceClosureArgument::class, $service_closure); $ref = $service_closure->getValues()[0]; $this->assertInstanceOf(Reference::class, $ref); $this->assertEquals('example_service_1', $ref); } /** Loading