diff -u b/core/core.services.yml b/core/core.services.yml --- b/core/core.services.yml +++ b/core/core.services.yml @@ -471,8 +471,7 @@ arguments: ['@app.root', '@module_handler', '@cache.discovery'] theme.negotiator: class: Drupal\Core\Theme\ThemeNegotiator - arguments: ['@access_check.theme'] - parent: container.trait + arguments: ['@access_check.theme', '@class_resolver'] tags: - { name: service_id_collector, tag: theme_negotiator } theme.negotiator.default: diff -u b/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php --- b/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php +++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php @@ -23,9 +23,10 @@ * second argument. * * To lazily instantiate services the service ID collector pattern can be used, - * but the consumer service needs to be ContainerAware. As constructor injection - * is used, processors cannot be added at runtime via this method. However, a - * consuming service could have setter methods to allow runtime additions. + * but the consumer service needs to also inject the 'class_resolver' service. + * As constructor injection is used, processors cannot be added at runtime via + * this method. However, a consuming service could have setter methods to allow + * runtime additions. * * These differ from plugins in that all processors are explicitly registered by * service providers (driven by declarative configuration in code); the mere @@ -87,14 +88,11 @@ * If at least one tagged service is required but none are found. */ public function process(ContainerBuilder $container) { - foreach ($container->findTaggedServiceIds('service_collector') as $consumer_id => $passes) { - foreach ($passes as $pass) { + foreach ($container->getDefinitions() as $consumer_id => $definition) { + foreach ($definition->getTag('service_collector') as $pass) { $this->processServiceCollectorPass($pass, $consumer_id, $container); } - } - - foreach ($container->findTaggedServiceIds('service_id_collector') as $consumer_id => $passes) { - foreach ($passes as $pass) { + foreach ($definition->getTag('service_id_collector') as $pass) { $this->processServiceIdCollectorPass($pass, $consumer_id, $container); } } @@ -128,10 +126,10 @@ if ($param->getClass()) { $interface = $param->getClass(); } - else if ($param->getName() === 'id') { + elseif ($param->getName() === 'id') { $id_pos = $pos; } - else if ($param->getName() === 'priority') { + elseif ($param->getName() === 'priority') { $priority_pos = $pos; } else { diff -u b/core/lib/Drupal/Core/Theme/ThemeNegotiator.php b/core/lib/Drupal/Core/Theme/ThemeNegotiator.php --- b/core/lib/Drupal/Core/Theme/ThemeNegotiator.php +++ b/core/lib/Drupal/Core/Theme/ThemeNegotiator.php @@ -2,9 +2,8 @@ namespace Drupal\Core\Theme; +use Drupal\Core\DependencyInjection\ClassResolverInterface; use Drupal\Core\Routing\RouteMatchInterface; -use Symfony\Component\DependencyInjection\ContainerAware; -use Symfony\Component\DependencyInjection\ContainerAwareTrait; /** * Provides a class which determines the active theme of the page. @@ -14,8 +13,6 @@ */ class ThemeNegotiator implements ThemeNegotiatorInterface { - use ContainerAwareTrait; - /** * Holds an array of theme negotiator IDs, sorted by priority. * @@ -31,16 +28,26 @@ protected $themeAccess; /** + * The class resolver. + * + * @var \Drupal\Core\DependencyInjection\ClassResolverInterface + */ + protected $classResolver; + + /** * Constructs a new ThemeNegotiator. * * @param \Drupal\Core\Theme\ThemeAccessCheck $theme_access * The access checker for themes. + * @param \Drupal\Core\DependencyInjection\ClassResolverInterface $class_resolver + * The class resolver. * @param string[] $negotiators * An array of negotiator IDs. */ - public function __construct(ThemeAccessCheck $theme_access, array $negotiators) { + public function __construct(ThemeAccessCheck $theme_access, ClassResolverInterface $class_resolver, array $negotiators) { $this->themeAccess = $theme_access; $this->negotiators = $negotiators; + $this->classResolver = $class_resolver; } /** @@ -55,7 +62,7 @@ */ public function determineActiveTheme(RouteMatchInterface $route_match) { foreach ($this->negotiators as $negotiator_id) { - $negotiator = $this->container->get($negotiator_id); + $negotiator = $this->classResolver->getInstanceFromDefinition($negotiator_id); if ($negotiator->applies($route_match)) { $theme = $negotiator->determineActiveTheme($route_match); diff -u b/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php b/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php --- b/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php +++ b/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php @@ -2,6 +2,7 @@ namespace Drupal\Tests\Core\Theme; +use Drupal\Core\DependencyInjection\ClassResolver; use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\Routing\RouteMatch; use Drupal\Core\Theme\ThemeNegotiator; @@ -220,6 +221,8 @@ protected function createThemeNegotiator(array $negotiators) { - $theme_negotiator = new ThemeNegotiator($this->themeAccessCheck, $negotiators); - $theme_negotiator->setContainer($this->container); + $resolver = new ClassResolver(); + $resolver->setContainer($this->container); + $theme_negotiator = new ThemeNegotiator($this->themeAccessCheck, $resolver, $negotiators); return $theme_negotiator; } + }