From a058be438b08f9fd11cfbaa77c68ce068ae4f5e2 Mon Sep 17 00:00:00 2001 From: Alex Pott Date: Thu, 21 Mar 2024 08:41:16 +0000 Subject: [PATCH] Issue #3431362 by Spokje, longwave: Remove support for ContainerAwareInterface --- core/.deprecation-ignore.txt | 5 --- core/.phpstan-baseline.php | 18 -------- .../Core/Controller/ControllerResolver.php | 7 +-- .../DependencyInjection/ClassResolver.php | 28 +----------- .../Controller/ControllerResolverTest.php | 45 +++---------------- .../DependencySerializationTest.php | 3 +- .../Core/Utility/CallableResolverTest.php | 35 +-------------- 7 files changed, 11 insertions(+), 130 deletions(-) diff --git a/core/.deprecation-ignore.txt b/core/.deprecation-ignore.txt index 31990122cab..e56e2cbd783 100644 --- a/core/.deprecation-ignore.txt +++ b/core/.deprecation-ignore.txt @@ -37,8 +37,3 @@ %Since symfony/dependency-injection 6.4: "Symfony\\Component\\DependencyInjection\\ContainerAwareTrait" is deprecated, use dependency injection instead.% %The "Drupal\\Core\\Logger\\LoggerChannelFactory" class implements "Symfony\\Component\\DependencyInjection\\ContainerAwareInterface" that is deprecated since Symfony 6.4, use dependency injection instead.% %The "Drupal\\Core\\Logger\\LoggerChannelFactory" class uses "Symfony\\Component\\DependencyInjection\\ContainerAwareTrait" that is deprecated since Symfony 6.4, use dependency injection instead.% -%The "Drupal\\Core\\Queue\\QueueFactory" class implements "Symfony\\Component\\DependencyInjection\\ContainerAwareInterface" that is deprecated since Symfony 6.4, use dependency injection instead.% -%The "Drupal\\Core\\Queue\\QueueFactory" class uses "Symfony\\Component\\DependencyInjection\\ContainerAwareTrait" that is deprecated since Symfony 6.4, use dependency injection instead.% -%The "Drupal\\Tests\\Core\\Controller\\MockContainerAware" class implements "Symfony\\Component\\DependencyInjection\\ContainerAwareInterface" that is deprecated since Symfony 6.4, use dependency injection instead.% -%The "Drupal\\Tests\\Core\\DependencyInjection\\DependencySerializationTestDummy" class implements "Symfony\\Component\\DependencyInjection\\ContainerAwareInterface" that is deprecated since Symfony 6.4, use dependency injection instead.% -%The "Drupal\\Tests\\Core\\Utility\\MockContainerAware" class implements "Symfony\\Component\\DependencyInjection\\ContainerAwareInterface" that is deprecated since Symfony 6.4, use dependency injection instead.% diff --git a/core/.phpstan-baseline.php b/core/.phpstan-baseline.php index 31df6665c84..69791e0b36b 100644 --- a/core/.phpstan-baseline.php +++ b/core/.phpstan-baseline.php @@ -2264,24 +2264,12 @@ https\\://github\\.com/sebastianbergmann/phpunit/issues/5062$#', 'count' => 1, 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Config/ConfigTest.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Class Drupal\\\\Tests\\\\Core\\\\Controller\\\\MockContainerAware implements deprecated interface Symfony\\\\Component\\\\DependencyInjection\\\\ContainerAwareInterface\\: -since Symfony 6\\.4, use dependency injection instead$#', - 'count' => 1, - 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php', -]; $ignoreErrors[] = [ 'message' => '#^Call to deprecated method expectError\\(\\) of class PHPUnit\\\\Framework\\\\TestCase\\: https\\://github\\.com/sebastianbergmann/phpunit/issues/5062$#', 'count' => 1, 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Database/ConditionTest.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Class Drupal\\\\Tests\\\\Core\\\\DependencyInjection\\\\DependencySerializationTestDummy implements deprecated interface Symfony\\\\Component\\\\DependencyInjection\\\\ContainerAwareInterface\\: -since Symfony 6\\.4, use dependency injection instead$#', - 'count' => 1, - 'path' => __DIR__ . '/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php', -]; $ignoreErrors[] = [ 'message' => '#^Trying to mock an undefined method getRevisionId\\(\\) on class Drupal\\\\Tests\\\\Core\\\\Entity\\\\UrlTestEntity\\.$#', 'count' => 1, @@ -2374,12 +2362,6 @@ $ignoreErrors[] = [ 'count' => 1, 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Test/AssertContentTraitTest.php', ]; -$ignoreErrors[] = [ - 'message' => '#^Class Drupal\\\\Tests\\\\Core\\\\Utility\\\\MockContainerAware implements deprecated interface Symfony\\\\Component\\\\DependencyInjection\\\\ContainerAwareInterface\\: -since Symfony 6\\.4, use dependency injection instead$#', - 'count' => 1, - 'path' => __DIR__ . '/tests/Drupal/Tests/Core/Utility/CallableResolverTest.php', -]; $ignoreErrors[] = [ 'message' => '#^Call to deprecated method getConfig\\(\\) of class GuzzleHttp\\\\ClientInterface\\: ClientInterface\\:\\:getConfig will be removed in guzzlehttp/guzzle\\:8\\.0\\.$#', diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php index 0aaacbea819..c0d3b142022 100644 --- a/core/lib/Drupal/Core/Controller/ControllerResolver.php +++ b/core/lib/Drupal/Core/Controller/ControllerResolver.php @@ -10,12 +10,7 @@ use Symfony\Component\HttpFoundation\Request; /** * ControllerResolver to enhance controllers beyond Symfony's basic handling. * - * It adds two behaviors: - * - * - When creating a new object-based controller that implements - * ContainerAwareInterface, inject the container into it. While not always - * necessary, that allows a controller to vary the services it needs at - * runtime. + * It adds one behavior: * * - By default, a controller name follows the class::method notation. This * class adds the possibility to use a service from the container as a diff --git a/core/lib/Drupal/Core/DependencyInjection/ClassResolver.php b/core/lib/Drupal/Core/DependencyInjection/ClassResolver.php index 66ce3d5e1d6..d3fff3a7533 100644 --- a/core/lib/Drupal/Core/DependencyInjection/ClassResolver.php +++ b/core/lib/Drupal/Core/DependencyInjection/ClassResolver.php @@ -2,7 +2,6 @@ namespace Drupal\Core\DependencyInjection; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -15,14 +14,10 @@ class ClassResolver implements ClassResolverInterface { /** * Constructs a new ClassResolver object. * - * @param \Symfony\Component\DependencyInjection\ContainerInterface|null $container + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container * The service container. */ - public function __construct(protected ?ContainerInterface $container = NULL) { - if ($this->container === NULL) { - @trigger_error('Calling ' . __METHOD__ . ' without the $container argument is deprecated in drupal:10.3.0 and it will be required in drupal:11.0.0. See https://www.drupal.org/node/3419963', E_USER_DEPRECATED); - $this->container = \Drupal::getContainer(); - } + public function __construct(protected ContainerInterface $container) { } /** @@ -45,26 +40,7 @@ class ClassResolver implements ClassResolverInterface { } } - if ($instance instanceof ContainerAwareInterface) { - @trigger_error('Implementing \Symfony\Component\DependencyInjection\ContainerAwareInterface is deprecated in drupal:10.3.0 and it will be removed in drupal:11.0.0. Implement \Drupal\Core\DependencyInjection\ContainerInjectionInterface and use dependency injection instead. See https://www.drupal.org/node/3428661', E_USER_DEPRECATED); - $instance->setContainer($this->container); - } - return $instance; } - /** - * Sets the service container. - * - * @deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. - * Instead, you should pass the container as an argument in the - * __construct() method. - * - * @see https://www.drupal.org/node/3419963 - */ - public function setContainer(?ContainerInterface $container): void { - @trigger_error(__METHOD__ . '() is deprecated in drupal:10.3.0 and is removed from drupal:11.0.0. Instead, you should pass the container as an argument in the __construct() method. See https://www.drupal.org/node/3419963', E_USER_DEPRECATED); - $this->container = $container; - } - } diff --git a/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php b/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php index 4e4ec81a6ca..bfc368dd08d 100644 --- a/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php +++ b/core/tests/Drupal/Tests/Core/Controller/ControllerResolverTest.php @@ -11,7 +11,6 @@ use Drupal\Core\Routing\RouteMatchInterface; use Drupal\Core\Utility\CallableResolver; use Drupal\Tests\UnitTestCase; use Psr\Http\Message\ServerRequestInterface; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; @@ -52,12 +51,8 @@ class ControllerResolverTest extends UnitTestCase { * Tests createController(). * * @dataProvider providerTestCreateController - * @group legacy */ - public function testCreateController($controller, $class, $output, string $deprecation = NULL) { - if ($deprecation) { - $this->expectDeprecation($deprecation); - } + public function testCreateController($controller, $class, $output) { $this->container->set('some_service', new MockController()); $result = $this->controllerResolver->getControllerFromDefinition($controller); $this->assertCallableController($result, $class, $output); @@ -74,13 +69,6 @@ class ControllerResolverTest extends UnitTestCase { ['some_service:getResult', 'Drupal\Tests\Core\Controller\MockController', 'This is a regular controller.'], // Tests a class with injection. ['Drupal\Tests\Core\Controller\MockContainerInjection::getResult', 'Drupal\Tests\Core\Controller\MockContainerInjection', 'This used injection.'], - // Tests a ContainerAware class. - [ - 'Drupal\Tests\Core\Controller\MockContainerAware::getResult', - 'Drupal\Tests\Core\Controller\MockContainerAware', - 'This is container aware.', - 'Implementing \Symfony\Component\DependencyInjection\ContainerAwareInterface is deprecated in drupal:10.3.0 and it will be removed in drupal:11.0.0. Implement \Drupal\Core\DependencyInjection\ContainerInjectionInterface and use dependency injection instead. See https://www.drupal.org/node/3428661', - ], ]; } @@ -104,12 +92,8 @@ class ControllerResolverTest extends UnitTestCase { * Tests getController(). * * @dataProvider providerTestGetController - * @group legacy */ public function testGetController($attributes, $class, $output = NULL) { - if ($class) { - $this->expectDeprecation('Implementing \Symfony\Component\DependencyInjection\ContainerAwareInterface is deprecated in drupal:10.3.0 and it will be removed in drupal:11.0.0. Implement \Drupal\Core\DependencyInjection\ContainerInjectionInterface and use dependency injection instead. See https://www.drupal.org/node/3428661'); - } $request = new Request([], [], $attributes); $result = $this->controllerResolver->getController($request); if ($class) { @@ -126,7 +110,11 @@ class ControllerResolverTest extends UnitTestCase { public static function providerTestGetController() { return [ // Tests passing a controller via the request. - [['_controller' => 'Drupal\Tests\Core\Controller\MockContainerAware::getResult'], 'Drupal\Tests\Core\Controller\MockContainerAware', 'This is container aware.'], + [ + ['_controller' => MockContainerInjection::class . '::getResult'], + MockContainerInjection::class, + 'This used injection.', + ], // Tests a request with no controller specified. [[], FALSE], ]; @@ -232,28 +220,7 @@ class MockContainerInjection implements ContainerInjectionInterface { } } -class MockContainerAware implements ContainerAwareInterface { - /** - * The service container. - */ - protected ContainerInterface $container; - - /** - * Sets the service container. - */ - public function setContainer(?ContainerInterface $container): void { - $this->container = $container; - } - - public function getResult() { - if (empty($this->container)) { - throw new \Exception('Container was not injected.'); - } - return 'This is container aware.'; - } - -} class MockInvokeController { public function __invoke() { diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php index 1b3166e52ad..085f8a01846 100644 --- a/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php +++ b/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php @@ -8,7 +8,6 @@ use Drupal\Component\DependencyInjection\ReverseContainer; use Drupal\Core\DependencyInjection\DependencySerializationTrait; use Drupal\Core\Test\TestKernel; use Drupal\Tests\UnitTestCase; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -46,7 +45,7 @@ class DependencySerializationTest extends UnitTestCase { /** * Defines a test class which has a single service as dependency. */ -class DependencySerializationTestDummy implements ContainerAwareInterface { +class DependencySerializationTestDummy { use DependencySerializationTrait; diff --git a/core/tests/Drupal/Tests/Core/Utility/CallableResolverTest.php b/core/tests/Drupal/Tests/Core/Utility/CallableResolverTest.php index c12d2687abd..9ded9181a29 100644 --- a/core/tests/Drupal/Tests/Core/Utility/CallableResolverTest.php +++ b/core/tests/Drupal/Tests/Core/Utility/CallableResolverTest.php @@ -9,7 +9,6 @@ use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Utility\CallableResolver; use Drupal\Tests\UnitTestCase; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -42,12 +41,8 @@ class CallableResolverTest extends UnitTestCase { /** * @dataProvider callableResolverTestCases * @covers ::getCallableFromDefinition - * @group legacy */ - public function testCallbackResolver($definition, $result, string $deprecation = NULL) { - if ($deprecation) { - $this->expectDeprecation($deprecation); - } + public function testCallbackResolver($definition, $result) { $argument = 'bar'; $this->assertEquals($result . '+' . $argument, $this->resolver->getCallableFromDefinition($definition)($argument)); } @@ -99,11 +94,6 @@ class CallableResolverTest extends UnitTestCase { '\Drupal\Tests\Core\Utility\MockContainerInjection::getResult', 'Drupal\Tests\Core\Utility\MockContainerInjection::getResult-foo', ], - 'Non-static function, instantiated by class resolver, container aware' => [ - '\Drupal\Tests\Core\Utility\MockContainerAware::getResult', - 'Drupal\Tests\Core\Utility\MockContainerAware::getResult', - 'Implementing \Symfony\Component\DependencyInjection\ContainerAwareInterface is deprecated in drupal:10.3.0 and it will be removed in drupal:11.0.0. Implement \Drupal\Core\DependencyInjection\ContainerInjectionInterface and use dependency injection instead. See https://www.drupal.org/node/3428661', - ], 'Service notation' => [ 'test_service:method', __CLASS__ . '::method', @@ -253,26 +243,3 @@ class NoInstantiationMockStaticCallable { class NoMethodCallable { } - -class MockContainerAware implements ContainerAwareInterface { - - /** - * The service container. - */ - protected ContainerInterface $container; - - /** - * Sets the service container. - */ - public function setContainer(?ContainerInterface $container): void { - $this->container = $container; - } - - public function getResult($suffix) { - if (empty($this->container)) { - throw new \Exception('Container was not injected.'); - } - return __METHOD__ . '+' . $suffix; - } - -}