Skip to content
Snippets Groups Projects
Verified Commit 72397df3 authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3450516 by kim.pepper: Add support for !service_closure custom tag in YamlFileLoader

parent cdb29302
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
......@@ -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);
}
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment