diff --git a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php index 59e761246bb6e248154bfca62e4331e5f6d45bd9..39c4a771f57607eab037b5e99f04fa28e24e394b 100644 --- a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php +++ b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php @@ -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; @@ -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); diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php index 56ed3e8894ed0433e3891648e8c90a04116cab4b..0fc5c0203e85c955a20a4604db33899345306d17 100644 --- a/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php +++ b/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php @@ -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 @@ -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, [ @@ -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); } /**