Verified Commit 3552c87a authored by Alex Pott's avatar Alex Pott
Browse files

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

(cherry picked from commit 72397df3)
(cherry picked from commit 03dbcdc7)
parent f761bb6a
Loading
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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);
+12 −0
Original line number Diff line number Diff line
@@ -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);
  }

  /**