From 56e9f8a83e13968f3e4875d9eda005d9aac31f36 Mon Sep 17 00:00:00 2001 From: Dave Long <dave@longwaveconsulting.com> Date: Sat, 17 Feb 2024 15:35:41 +0000 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, 28 insertions(+), 4 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 f1ea8cd5b79b..3fa6c3848397 100644 --- a/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/RegisterStreamWrappersPass.php @@ -20,11 +20,18 @@ public function process(ContainerBuilder $container) { $stream_wrapper_manager = $container->getDefinition('stream_wrapper_manager'); - 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) { + $scheme = $attributes['scheme']; + $stream_wrapper_manager->addMethodCall('addStreamWrapper', [ + $id, + $class, + $scheme, + ]); + } } } 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