diff --git a/core/core.services.yml b/core/core.services.yml index 9dc264e5be..89a4a7a27e 100644 --- a/core/core.services.yml +++ b/core/core.services.yml @@ -1667,6 +1667,8 @@ services: file.mime_type.guesser: class: Drupal\Core\File\MimeType\MimeTypeGuesser arguments: ['@stream_wrapper_manager'] + tags: + - { name: service_collector, tag: mime_type_guesser, call: addMimeTypeGuesser } lazy: true file.mime_type.guesser.extension: class: Drupal\Core\File\MimeType\ExtensionMimeTypeGuesser diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php index 92e9594c34..3ee76ade12 100644 --- a/core/lib/Drupal/Core/CoreServiceProvider.php +++ b/core/lib/Drupal/Core/CoreServiceProvider.php @@ -19,7 +19,6 @@ use Drupal\Core\DependencyInjection\ServiceProviderInterface; use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\DependencyInjection\Compiler\ModifyServiceDefinitionsPass; -use Drupal\Core\DependencyInjection\Compiler\MimeTypePass; use Drupal\Core\DependencyInjection\Compiler\TaggedHandlersPass; use Drupal\Core\DependencyInjection\Compiler\RegisterEventSubscribersPass; use Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass; @@ -74,7 +73,6 @@ public function register(ContainerBuilder $container) { // Collect tagged handler services as method calls on consumer services. $container->addCompilerPass(new TaggedHandlersPass()); - $container->addCompilerPass(new MimeTypePass()); $container->addCompilerPass(new RegisterStreamWrappersPass()); $container->addCompilerPass(new GuzzleMiddlewarePass()); diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/MimeTypePass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/MimeTypePass.php deleted file mode 100644 index 87294d933a..0000000000 --- a/core/lib/Drupal/Core/DependencyInjection/Compiler/MimeTypePass.php +++ /dev/null @@ -1,68 +0,0 @@ -getDefinition('file.mime_type.guesser'); - - $tag = 'mime_type_guesser'; - $interface = MimeTypeGuesserInterface::class; - $deprecated_interface = LegacyMimeTypeGuesserInterface::class; - - // Find all tagged handlers. - $handlers = []; - foreach ($container->findTaggedServiceIds($tag) as $id => $attributes) { - // Validate the interface. - $handler = $container->getDefinition($id); - if (!is_subclass_of($handler->getClass(), $interface)) { - // Special handling for $deprecated_interface. - if (!is_subclass_of($handler->getClass(), $deprecated_interface)) { - throw new LogicException("Service '$id' does not implement $interface."); - } - } - $handlers[$id] = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0; - $interfaces[$id] = $handler->getClass(); - } - if (empty($handlers)) { - throw new LogicException(sprintf("At least one service tagged with '%s' is required.", $tag)); - } - - // Sort all handlers by priority. - arsort($handlers, SORT_NUMERIC); - - // Add a method call for each handler to the consumer service - // definition. - foreach ($handlers as $id => $priority) { - $arguments = [new Reference($id), $priority]; - if (is_subclass_of($interfaces[$id], $interface)) { - $consumer->addMethodCall('addMimeTypeGuesser', $arguments); - } - else { - $consumer->addMethodCall('addGuesser', $arguments); - } - } - } - -} diff --git a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php index 2f5fec835c..b4f40ac6e1 100644 --- a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php +++ b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php @@ -157,7 +157,13 @@ private function parseDefinition($id, $service, $file) } if (array_key_exists('deprecated', $service)) { - $alias->setDeprecated(true, $service['deprecated']); + if (method_exists($alias, 'getDeprecation')) { + // Symfony 5. + $alias->setDeprecated('', '', $service['deprecated']); + } else { + // Symfony 4. + $alias->setDeprecated(true, $service['deprecated']); + } } return; @@ -197,7 +203,13 @@ private function parseDefinition($id, $service, $file) } if (array_key_exists('deprecated', $service)) { - $definition->setDeprecated(true, $service['deprecated']); + if (method_exists($definition, 'getDeprecation')) { + // Symfony 5. + $definition->setDeprecated('', '', $service['deprecated']); + } else { + // Symfony 4. + $definition->setDeprecated(true, $service['deprecated']); + } } if (isset($service['factory'])) { diff --git a/core/lib/Drupal/Core/Update/UpdateServiceProvider.php b/core/lib/Drupal/Core/Update/UpdateServiceProvider.php index fd6b4e27dd..43110fb8f4 100644 --- a/core/lib/Drupal/Core/Update/UpdateServiceProvider.php +++ b/core/lib/Drupal/Core/Update/UpdateServiceProvider.php @@ -19,7 +19,14 @@ class UpdateServiceProvider implements ServiceProviderInterface, ServiceModifier */ public function register(ContainerBuilder $container) { $definition = new Definition('Drupal\Core\Cache\NullBackend', ['null']); - $definition->setDeprecated(TRUE, 'The "%service_id%\" service is deprecated. While updating Drupal all caches use \Drupal\Core\Update\UpdateBackend. See https://www.drupal.org/node/3066407'); + if (method_exists($definition, 'getDeprecation')) { + // Symfony 5. + $definition->setDeprecated('', '', 'The "%service_id%\" service is deprecated. While updating Drupal all caches use \Drupal\Core\Update\UpdateBackend. See https://www.drupal.org/node/3066407'); + } + else { + // Symfony 4. + $definition->setDeprecated(TRUE, 'The "%service_id%\" service is deprecated. While updating Drupal all caches use \Drupal\Core\Update\UpdateBackend. See https://www.drupal.org/node/3066407'); + } $definition->setPublic(TRUE); $container->setDefinition('cache.null', $definition); diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/Compiler/MimeTypePassTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/Compiler/MimeTypePassTest.php deleted file mode 100644 index 121c7d26b3..0000000000 --- a/core/tests/Drupal/Tests/Core/DependencyInjection/Compiler/MimeTypePassTest.php +++ /dev/null @@ -1,64 +0,0 @@ -setParameter('kernel.environment', $environment); - return $container; - } - - /** - * Tests backwards compatibility shim for MimeTypeGuesser interface changes. - */ - public function testProcessLegacy() { - $this->expectDeprecation('The "Drupal\Tests\Core\DependencyInjection\Compiler\LegacyMimeTypeGuesser" class implements "Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface" that is deprecated since Symfony 4.3, use {@link MimeTypesInterface} instead.'); - $container = $this->buildContainer(); - $container - ->register('file.mime_type.guesser', MimeTypeGuesser::class); - - $container - ->register('handler1', __NAMESPACE__ . '\NewMimeTypeGuesser') - ->addTag('mime_type_guesser', ['priority' => 200]); - $container - ->register('handler2', __NAMESPACE__ . '\LegacyMimeTypeGuesser') - ->addTag('mime_type_guesser', ['priority' => 100]); - - $handler_pass = new MimeTypePass(); - $handler_pass->process($container); - $method_calls = $container->getDefinition('file.mime_type.guesser')->getMethodCalls(); - $this->assertCount(2, $method_calls); - $this->assertSame(200, $method_calls[0][1][1]); - $this->assertSame(100, $method_calls[1][1][1]); - } - -} - -class NewMimeTypeGuesser implements MimeTypeGuesserInterface { - - public function guessMimeType(string $string): string {} - - public function isGuesserSupported(): bool {} - -} - -class LegacyMimeTypeGuesser implements LegacyMimeTypeGuesserInterface { - - public function guess($string) {} - -} diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php index f8b82e2fb7..bff672f3a7 100644 --- a/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php +++ b/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php @@ -92,20 +92,6 @@ public function testSetDefinition() { $this->assertFalse($service->isPublic()); } - /** - * @covers ::setDefinition - * - * @group legacy - */ - public function testLegacySetDefinition() { - // Test a service with public set to default. - $container = new ContainerBuilder(); - $definition = new Definition(); - $this->expectDeprecation('Not marking service definitions as public is deprecated in drupal:9.2.0 and is required in drupal:10.0.0. Call $definition->setPublic(TRUE) before calling ::setDefinition(). See https://www.drupal.org/node/3194517'); - $service = $container->setDefinition('foo', $definition); - $this->assertTrue($service->isPublic()); - } - /** * @covers ::setAlias */ diff --git a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php index ab6d28c686..00fcf99be9 100644 --- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php +++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php @@ -138,8 +138,6 @@ public static function getSkippedDeprecations() { 'assertFileNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileIsNotWritable() instead.', 'The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.', // Deprecation introduced in Symfony 5. - 'Since symfony/dependency-injection 5.1: The signature of method "Symfony\Component\DependencyInjection\Alias::setDeprecated()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', - 'Since symfony/dependency-injection 5.1: The signature of method "Symfony\Component\DependencyInjection\Definition::setDeprecated()" requires 3 arguments: "string $package, string $version, string $message", not defining them is deprecated.', 'Since symfony/http-foundation 5.1: Retrieving a non-string value from "Symfony\Component\HttpFoundation\InputBag::get()" is deprecated, and will throw a "Symfony\Component\HttpFoundation\Exception\BadRequestException" exception in Symfony 6.0, use "Symfony\Component\HttpFoundation\InputBag::all($key)" instead.', 'Since symfony/http-foundation 5.1: Passing a non-string value as 2nd argument to "Symfony\Component\HttpFoundation\InputBag::get()" is deprecated, pass a string or null instead.', 'Since symfony/yaml 5.1: Support for parsing numbers prefixed with 0 as octal numbers. They will be parsed as strings as of 6.0.',