From 8c8af4f3246a894211a299cd978d1c8da0eb5234 Mon Sep 17 00:00:00 2001 From: Lee Rowlands <lee.rowlands@previousnext.com.au> Date: Wed, 14 Feb 2024 17:37:27 +1000 Subject: [PATCH] Issue #2366129 by andypost, stefan.r, smustgrave, vacho: RegisterStreamWrappersPass and other have broken compiler pass for multiple tags --- .../Compiler/RegisterStreamWrappersPass.php | 15 ++++++++++----- .../file/tests/file_test/file_test.services.yml | 5 +++++ .../StreamWrapper/DummyMultipleStreamWrapper.php | 10 ++++++++++ .../src/Kernel/Extension/ModuleHandlerTest.php | 2 ++ 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php index d666af62e929..cb67305b1b0f 100644 --- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php @@ -23,12 +23,17 @@ public function process(ContainerBuilder $container) { $stream_wrapper_manager = $container->getDefinition('stream_wrapper_manager'); $services = []; - foreach ($container->findTaggedServiceIds('stream_wrapper') as $id => $attributes) { + foreach ($container->findTaggedServiceIds('stream_wrapper') as $id => $tags) { $class = $container->getDefinition($id)->getClass(); - $scheme = $attributes[0]['scheme']; - - $stream_wrapper_manager->addMethodCall('addStreamWrapper', [$id, $class, $scheme]); - + // Loop through all the tags for this stream wrapper as we may have + // multiple schemes. + foreach ($tags as $attributes) { + $stream_wrapper_manager->addMethodCall('addStreamWrapper', [ + $id, + $class, + $attributes['scheme'], + ]); + } $services[$id] = new Reference($id); } $stream_wrapper_manager->addArgument(ServiceLocatorTagPass::register($container, $services)); diff --git a/core/modules/file/tests/file_test/file_test.services.yml b/core/modules/file/tests/file_test/file_test.services.yml index 51b048997a23..e70db1ebd651 100644 --- a/core/modules/file/tests/file_test/file_test.services.yml +++ b/core/modules/file/tests/file_test/file_test.services.yml @@ -15,3 +15,8 @@ services: class: Drupal\file_test\StreamWrapper\DummyExternalReadOnlyWrapper tags: - { name: stream_wrapper, scheme: dummy-external-readonly } + stream_wrapper.dummy_multiple: + class: Drupal\file_test\StreamWrapper\DummyMultipleStreamWrapper + tags: + - { name: stream_wrapper, scheme: dummy1 } + - { name: stream_wrapper, scheme: dummy2 } diff --git a/core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php b/core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php new file mode 100644 index 000000000000..76ac49d97a5f --- /dev/null +++ b/core/modules/file/tests/file_test/src/StreamWrapper/DummyMultipleStreamWrapper.php @@ -0,0 +1,10 @@ +<?php + +namespace Drupal\file_test\StreamWrapper; + +/** + * Helper class for testing the stream wrapper registry. + * + * Dummy stream wrapper implementation (dummy1://, dummy2://). + */ +class DummyMultipleStreamWrapper extends DummyStreamWrapper {} diff --git a/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php b/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php index d9b213f45a72..09718581e4c3 100644 --- a/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php +++ b/core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php @@ -324,6 +324,8 @@ public function testModuleStreamWrappers() { file_exists('dummy://'); $stream_wrappers = \Drupal::service('stream_wrapper_manager')->getWrappers(); $this->assertTrue(isset($stream_wrappers['dummy'])); + $this->assertTrue(isset($stream_wrappers['dummy1'])); + $this->assertTrue(isset($stream_wrappers['dummy2'])); } /** -- GitLab