Issue #2942001 by dimitriskr, alexpott, gaurav.kapoor, smustgrave, andypost, almaudoh: Deprecate ThemeHandlerInterface::rebuildThemeData() and use extension.list.theme service instead

merge-requests/5079/merge
catch 2024-02-29 12:32:29 +00:00
parent 241cb51cd8
commit c1ac44516a
17 changed files with 78 additions and 41 deletions

View File

@ -684,7 +684,7 @@ services:
Drupal\Core\Extension\ThemeHandlerInterface: '@theme_handler'
theme_installer:
class: Drupal\Core\Extension\ThemeInstaller
arguments: ['@theme_handler', '@config.factory', '@config.installer', '@module_handler', '@config.manager', '@asset.css.collection_optimizer', '@router.builder', '@logger.channel.default', '@state', '@extension.list.module', '@theme.registry']
arguments: ['@theme_handler', '@config.factory', '@config.installer', '@module_handler', '@config.manager', '@asset.css.collection_optimizer', '@router.builder', '@logger.channel.default', '@state', '@extension.list.module', '@theme.registry', '@extension.list.theme']
Drupal\Core\Extension\ThemeInstallerInterface: '@theme_installer'
entity.memory_cache:
class: Drupal\Core\Cache\MemoryCache\MemoryCache
@ -1395,7 +1395,7 @@ services:
class: Drupal\Core\EventSubscriber\ConfigImportSubscriber
tags:
- { name: service_collector, tag: 'module_install.uninstall_validator', call: addUninstallValidator }
arguments: ['@theme_handler', '@extension.list.module']
arguments: ['@extension.list.theme', '@extension.list.module']
config_snapshot_subscriber:
class: Drupal\Core\EventSubscriber\ConfigSnapshotSubscriber
arguments: ['@config.manager', '@config.storage', '@config.storage.snapshot']

View File

@ -10,7 +10,7 @@ use Drupal\Core\Config\ConfigNameException;
use Drupal\Core\Extension\ConfigImportModuleUninstallValidatorInterface;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Extension\ModuleUninstallValidatorInterface;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\Extension\ThemeExtensionList;
use Drupal\Core\Installer\InstallerKernel;
/**
@ -33,11 +33,11 @@ class ConfigImportSubscriber extends ConfigImportValidateEventSubscriberBase {
protected $moduleExtensionList;
/**
* The theme handler.
* The theme extension list.
*
* @var \Drupal\Core\Extension\ThemeHandlerInterface
* @var \Drupal\Core\Extension\ThemeExtensionList
*/
protected $themeHandler;
protected ThemeExtensionList $themeList;
/**
* The uninstall validators.
@ -49,13 +49,13 @@ class ConfigImportSubscriber extends ConfigImportValidateEventSubscriberBase {
/**
* Constructs the ConfigImportSubscriber.
*
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
* The theme handler.
* @param \Drupal\Core\Extension\ThemeExtensionList $theme_extension_list
* The theme extension list.
* @param \Drupal\Core\Extension\ModuleExtensionList $extension_list_module
* The module extension list.
*/
public function __construct(ThemeHandlerInterface $theme_handler, ModuleExtensionList $extension_list_module) {
$this->themeHandler = $theme_handler;
public function __construct(ThemeExtensionList $theme_extension_list, ModuleExtensionList $extension_list_module) {
$this->themeList = $theme_extension_list;
$this->moduleExtensionList = $extension_list_module;
}
@ -353,7 +353,7 @@ class ConfigImportSubscriber extends ConfigImportValidateEventSubscriberBase {
*/
protected function getThemeData() {
if (!isset($this->themeData)) {
$this->themeData = $this->themeHandler->rebuildThemeData();
$this->themeData = $this->themeList->reset()->getList();
}
return $this->themeData;
}

View File

@ -125,6 +125,7 @@ class ThemeHandler implements ThemeHandlerInterface {
* {@inheritdoc}
*/
public function rebuildThemeData() {
@trigger_error("\Drupal\Core\Extension\ThemeHandlerInterface::rebuildThemeData() is deprecated in drupal:10.3.0 and is removed from drupal:12.0.0. Use \Drupal::service('extension.list.theme')->reset()->getList() instead. See https://www.drupal.org/node/3413196", E_USER_DEPRECATED);
return $this->themeList->reset()->getList();
}

View File

@ -74,6 +74,13 @@ interface ThemeHandlerInterface {
*
* @return \Drupal\Core\Extension\Extension[]
* An associative array of theme extensions.
*
* @deprecated in drupal:10.3.0 and is removed from drupal:12.0.0. Use
* \Drupal::service('extension.list.theme')->reset()->getList() instead.
*
* @see https://www.drupal.org/node/3413196
* @see \Drupal\Core\Extension\ThemeExtensionList::reset()
* @see \Drupal\Core\Extension\ThemeExtensionList::getList()
*/
public function rebuildThemeData();

View File

@ -102,8 +102,10 @@ class ThemeInstaller implements ThemeInstallerInterface {
* The module extension list.
* @param \Drupal\Core\Theme\Registry|null $themeRegistry
* The theme registry.
* @param \Drupal\Core\Extension\ThemeExtensionList|null $themeExtensionList
* The theme extension list.
*/
public function __construct(ThemeHandlerInterface $theme_handler, ConfigFactoryInterface $config_factory, ConfigInstallerInterface $config_installer, ModuleHandlerInterface $module_handler, ConfigManagerInterface $config_manager, AssetCollectionOptimizerInterface $css_collection_optimizer, RouteBuilderInterface $route_builder, LoggerInterface $logger, StateInterface $state, ModuleExtensionList $module_extension_list, protected ?Registry $themeRegistry = NULL) {
public function __construct(ThemeHandlerInterface $theme_handler, ConfigFactoryInterface $config_factory, ConfigInstallerInterface $config_installer, ModuleHandlerInterface $module_handler, ConfigManagerInterface $config_manager, AssetCollectionOptimizerInterface $css_collection_optimizer, RouteBuilderInterface $route_builder, LoggerInterface $logger, StateInterface $state, ModuleExtensionList $module_extension_list, protected ?Registry $themeRegistry = NULL, protected ?ThemeExtensionList $themeExtensionList = NULL) {
$this->themeHandler = $theme_handler;
$this->configFactory = $config_factory;
$this->configInstaller = $config_installer;
@ -118,6 +120,11 @@ class ThemeInstaller implements ThemeInstallerInterface {
@trigger_error('Calling ' . __METHOD__ . '() without the $themeRegistry argument is deprecated in drupal:10.1.0 and will be required in drupal:11.0.0. See https://www.drupal.org/node/3350906', E_USER_DEPRECATED);
$this->themeRegistry = \Drupal::service('theme.registry');
}
if ($this->themeExtensionList === NULL) {
@trigger_error('Calling ' . __METHOD__ . '() without the $themeExtensionList argument is deprecated in drupal:10.3.0 and will be required in drupal:11.0.0. See https://www.drupal.org/node/3413308', E_USER_DEPRECATED);
$this->themeExtensionList = \Drupal::service('extension.list.theme');
}
}
/**
@ -126,7 +133,7 @@ class ThemeInstaller implements ThemeInstallerInterface {
public function install(array $theme_list, $install_dependencies = TRUE) {
$extension_config = $this->configFactory->getEditable('core.extension');
$theme_data = $this->themeHandler->rebuildThemeData();
$theme_data = $this->themeExtensionList->reset()->getList();
$installed_themes = $extension_config->get('theme') ?: [];
$installed_modules = $extension_config->get('module') ?: [];

View File

@ -83,7 +83,7 @@ class Theme extends Updater implements UpdaterInterface {
public function postInstall() {
// Update the theme info.
clearstatcache();
\Drupal::service('theme_handler')->rebuildThemeData();
\Drupal::service('extension.list.theme')->reset();
}
/**

View File

@ -519,7 +519,7 @@ class ConfigImportUITest extends BrowserTestBase {
$module_data = $this->container->get('extension.list.module')->getList();
$this->assertTrue(isset($module_data['node']->requires['text']), 'The Node module depends on the Text module.');
unset($core['theme']['test_basetheme']);
$theme_data = \Drupal::service('theme_handler')->rebuildThemeData();
$theme_data = \Drupal::service('extension.list.theme')->reset()->getList();
$this->assertTrue(isset($theme_data['test_subtheme']->requires['test_basetheme']), 'The Test Subtheme theme depends on the Test Basetheme theme.');
// This module does not exist.
$core['module']['does_not_exist'] = 0;

View File

@ -105,7 +105,7 @@ function locale_translation_project_list() {
'interface translation server pattern',
];
$module_data = _locale_translation_prepare_project_list(\Drupal::service('extension.list.module')->getList(), 'module');
$theme_data = _locale_translation_prepare_project_list(\Drupal::service('theme_handler')->rebuildThemeData(), 'theme');
$theme_data = _locale_translation_prepare_project_list(\Drupal::service('extension.list.theme')->reset()->getList(), 'theme');
$project_info = new ProjectInfo();
$project_info->processInfoList($projects, $module_data, 'module', TRUE, $additional_whitelist);
$project_info->processInfoList($projects, $theme_data, 'theme', TRUE, $additional_whitelist);

View File

@ -8,7 +8,6 @@ use Drupal\Core\Extension\ExtensionLifecycle;
use Drupal\Core\Extension\ModuleDependencyMessageTrait;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Extension\ThemeExtensionList;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Link;
use Drupal\Core\Menu\MenuLinkTreeInterface;
@ -46,13 +45,6 @@ class SystemController extends ControllerBase {
*/
protected $formBuilder;
/**
* The theme handler service.
*
* @var \Drupal\Core\Extension\ThemeHandlerInterface
*/
protected $themeHandler;
/**
* The menu link tree service.
*
@ -67,6 +59,13 @@ class SystemController extends ControllerBase {
*/
protected $moduleExtensionList;
/**
* The theme extension list.
*
* @var \Drupal\Core\Extension\ThemeExtensionList
*/
protected ThemeExtensionList $themeExtensionList;
/**
* Constructs a new SystemController.
*
@ -76,20 +75,20 @@ class SystemController extends ControllerBase {
* The theme access checker service.
* @param \Drupal\Core\Form\FormBuilderInterface $form_builder
* The form builder.
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
* The theme handler.
* @param \Drupal\Core\Menu\MenuLinkTreeInterface $menu_link_tree
* The menu link tree service.
* @param \Drupal\Core\Extension\ModuleExtensionList $module_extension_list
* The module extension list.
* @param \Drupal\Core\Extension\ThemeExtensionList $theme_extension_list
* The theme extension list.
*/
public function __construct(SystemManager $systemManager, ThemeAccessCheck $theme_access, FormBuilderInterface $form_builder, ThemeHandlerInterface $theme_handler, MenuLinkTreeInterface $menu_link_tree, ModuleExtensionList $module_extension_list) {
public function __construct(SystemManager $systemManager, ThemeAccessCheck $theme_access, FormBuilderInterface $form_builder, MenuLinkTreeInterface $menu_link_tree, ModuleExtensionList $module_extension_list, ThemeExtensionList $theme_extension_list) {
$this->systemManager = $systemManager;
$this->themeAccess = $theme_access;
$this->formBuilder = $form_builder;
$this->themeHandler = $theme_handler;
$this->menuLinkTree = $menu_link_tree;
$this->moduleExtensionList = $module_extension_list;
$this->themeExtensionList = $theme_extension_list;
}
/**
@ -100,9 +99,9 @@ class SystemController extends ControllerBase {
$container->get('system.manager'),
$container->get('access_check.theme'),
$container->get('form_builder'),
$container->get('theme_handler'),
$container->get('menu.link_tree'),
$container->get('extension.list.module')
$container->get('extension.list.module'),
$container->get('extension.list.theme'),
);
}
@ -204,7 +203,7 @@ class SystemController extends ControllerBase {
public function themesPage() {
$config = $this->config('system.theme');
// Get all available themes.
$themes = $this->themeHandler->rebuildThemeData();
$themes = $this->themeExtensionList->reset()->getList();
// Remove obsolete themes.
$themes = array_filter($themes, function ($theme) {

View File

@ -343,7 +343,7 @@ class ThemeTest extends BrowserTestBase {
$this->submitForm($edit, 'Save configuration');
// Check the display of non stable themes.
$themes = \Drupal::service('theme_handler')->rebuildThemeData();
$themes = \Drupal::service('extension.list.theme')->reset()->getList();
$experimental_version = $themes['experimental_theme_test']->info['version'];
$deprecated_version = $themes['deprecated_theme_test']->info['version'];
$this->drupalGet('admin/appearance');
@ -531,7 +531,7 @@ class ThemeTest extends BrowserTestBase {
// This checks for a regression. See https://www.drupal.org/node/2498691.
$this->assertSession()->pageTextNotContains("The $theme_machine_name theme was not found.");
$themes = \Drupal::service('theme_handler')->rebuildThemeData();
$themes = \Drupal::service('extension.list.theme')->reset()->getList();
$version = $themes[$theme_machine_name]->info['version'];
// Confirm the theme is indicated as the default theme and administration

View File

@ -88,7 +88,7 @@ class EntityFilteringThemeTest extends BrowserTestBase {
$listing = new ExtensionDiscovery(\Drupal::root());
$this->themes = $listing->scan('theme', FALSE);
/** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
$theme_data = \Drupal::service('theme_handler')->rebuildThemeData();
$theme_data = \Drupal::service('extension.list.theme')->reset()->getList();
foreach (array_keys($this->themes) as $theme) {
// Skip obsolete and deprecated themes.
$info = $theme_data[$theme]->info;

View File

@ -333,7 +333,7 @@ class ModuleHandlerTest extends KernelTestBase {
*/
public function testThemeMetaData() {
// Generate the list of available themes.
$themes = \Drupal::service('theme_handler')->rebuildThemeData();
$themes = \Drupal::service('extension.list.theme')->reset()->getList();
// Check that the mtime field exists for the olivero theme.
$this->assertNotEmpty($themes['olivero']->info['mtime'], 'The olivero.info.yml file modification time field is present.');
// Use 0 if mtime isn't present, to avoid an array index notice.

View File

@ -6,6 +6,7 @@ use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Extension\ModuleExtensionList;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ThemeExtensionList;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
use Drupal\Core\StringTranslation\TranslationInterface;
@ -75,6 +76,13 @@ class UpdateManager implements UpdateManagerInterface {
*/
protected $moduleExtensionList;
/**
* The theme extension list.
*
* @var \Drupal\Core\Extension\ThemeExtensionList
*/
protected ThemeExtensionList $themeExtensionList;
/**
* Constructs an UpdateManager.
*
@ -90,10 +98,12 @@ class UpdateManager implements UpdateManagerInterface {
* The expirable key/value factory.
* @param \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler
* The theme handler.
* @param \Drupal\Core\Extension\ModuleExtensionList|null $extension_list_module
* @param \Drupal\Core\Extension\ModuleExtensionList $extension_list_module
* The module extension list.
* @param \Drupal\Core\Extension\ThemeExtensionList $extension_list_theme
* The theme extension list.
*/
public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, UpdateProcessorInterface $update_processor, TranslationInterface $translation, KeyValueFactoryInterface $key_value_expirable_factory, ThemeHandlerInterface $theme_handler, ModuleExtensionList $extension_list_module) {
public function __construct(ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, UpdateProcessorInterface $update_processor, TranslationInterface $translation, KeyValueFactoryInterface $key_value_expirable_factory, ThemeHandlerInterface $theme_handler, ModuleExtensionList $extension_list_module, ThemeExtensionList $extension_list_theme) {
$this->updateSettings = $config_factory->get('update.settings');
$this->moduleHandler = $module_handler;
$this->updateProcessor = $update_processor;
@ -103,6 +113,7 @@ class UpdateManager implements UpdateManagerInterface {
$this->availableReleasesTempStore = $key_value_expirable_factory->get('update_available_releases');
$this->projects = [];
$this->moduleExtensionList = $extension_list_module;
$this->themeExtensionList = $extension_list_theme;
}
/**
@ -141,7 +152,7 @@ class UpdateManager implements UpdateManagerInterface {
if (empty($this->projects)) {
// Still empty, so we have to rebuild.
$module_data = $this->moduleExtensionList->reset()->getList();
$theme_data = $this->themeHandler->rebuildThemeData();
$theme_data = $this->themeExtensionList->reset()->getList();
$project_info = new ProjectInfo();
$project_info->processInfoList($this->projects, $module_data, 'module', TRUE);
$project_info->processInfoList($this->projects, $theme_data, 'theme', TRUE);

View File

@ -425,7 +425,7 @@ class UpdateContribTest extends UpdateTestBase {
],
]);
$projects = \Drupal::service('update.manager')->getProjects();
$theme_data = \Drupal::service('theme_handler')->rebuildThemeData();
$theme_data = \Drupal::service('extension.list.theme')->reset()->getList();
$project_info = new ProjectInfo();
$project_info->processInfoList($projects, $theme_data, 'theme', TRUE);

View File

@ -6,7 +6,7 @@ services:
- { name: access_check, applies_to: _access_update_manager }
update.manager:
class: Drupal\update\UpdateManager
arguments: ['@config.factory', '@module_handler', '@update.processor', '@string_translation', '@keyvalue.expirable', '@theme_handler', '@extension.list.module']
arguments: ['@config.factory', '@module_handler', '@update.processor', '@string_translation', '@keyvalue.expirable', '@theme_handler', '@extension.list.module', '@extension.list.theme']
Drupal\update\UpdateManagerInterface: '@update.manager'
update.processor:
class: Drupal\update\UpdateProcessor

View File

@ -8,6 +8,7 @@ use Drupal\Core\Extension\ExtensionNameReservedException;
use Drupal\Core\Extension\MissingDependencyException;
use Drupal\Core\Extension\ModuleUninstallValidatorException;
use Drupal\Core\Extension\Exception\UnknownExtensionException;
use Drupal\Core\Extension\ThemeExtensionList;
use Drupal\KernelTests\KernelTestBase;
/**
@ -54,7 +55,7 @@ class ThemeInstallerTest extends KernelTestBase {
$this->assertEmpty(array_keys(\Drupal::service('theme_handler')->listInfo()));
// Rebuilding available themes should always yield results though.
$this->assertNotEmpty($this->themeHandler()->rebuildThemeData()['stark'], 'ThemeHandler::rebuildThemeData() yields all available themes.');
$this->assertNotEmpty($this->extensionListTheme()->reset()->getList()['stark'], 'ThemeExtensionList::getList() yields all available themes.');
// theme_get_setting() should return global default theme settings.
$this->assertTrue(theme_get_setting('features.favicon'));
@ -488,4 +489,13 @@ class ThemeInstallerTest extends KernelTestBase {
return $this->container->get('module_installer');
}
/**
* Returns the ThemeExtensionList.
*
* @return \Drupal\Core\Extension\ThemeExtensionList
*/
protected function extensionListTheme(): ThemeExtensionList {
return $this->container->get('extension.list.theme');
}
}

View File

@ -69,8 +69,10 @@ class ThemeHandlerTest extends UnitTestCase {
* Tests rebuilding the theme data.
*
* @see \Drupal\Core\Extension\ThemeHandler::rebuildThemeData()
* @group legacy
*/
public function testRebuildThemeData() {
$this->expectDeprecation("\Drupal\Core\Extension\ThemeHandlerInterface::rebuildThemeData() is deprecated in drupal:10.3.0 and is removed from drupal:12.0.0. Use \Drupal::service('extension.list.theme')->reset()->getList() instead. See https://www.drupal.org/node/3413196");
$this->themeList->expects($this->once())
->method('reset')
->willReturnSelf();