function ModuleInstaller::getModulesToInstall
File
-
core/
lib/ Drupal/ Core/ Extension/ ModuleInstaller.php, line 110
Class
- ModuleInstaller
- Default implementation of the module installer.
Namespace
Drupal\Core\ExtensionCode
public function getModulesToInstall(array $module_list, bool $enable_dependencies = TRUE) : array {
$installed_modules = \Drupal::configFactory()->get('core.extension')
->get('module') ?: [];
// Only process currently uninstalled modules.
$module_list = array_values(array_diff($module_list, array_keys($installed_modules)));
if (empty($module_list)) {
return [];
}
// Get all module data so we can find dependencies and sort. The module
// list needs to be reset so that it can re-scan and include any new
// modules that may have been added directly into the filesystem.
$module_data = \Drupal::service('extension.list.module')->reset()
->getList();
// Ensure all of the requested modules actually exist.
if ($missing_modules = array_diff_key(array_flip($module_list), $module_data)) {
throw new MissingDependencyException(sprintf('Unable to install modules %s due to missing modules %s.', implode(', ', $module_list), implode(', ', array_keys($missing_modules))));
}
foreach ($module_list as $module) {
if (!empty($module_data[$module]->info['core_incompatible'])) {
throw new MissingDependencyException("Unable to install modules: module '{$module}' is incompatible with this version of Drupal core.");
}
if ($module_data[$module]->info[ExtensionLifecycle::LIFECYCLE_IDENTIFIER] === ExtensionLifecycle::OBSOLETE) {
throw new ObsoleteExtensionException("Unable to install modules: module '{$module}' is obsolete.");
}
}
if ($enable_dependencies) {
$module_list = array_combine($module_list, $module_list);
// Add dependencies to the list. The new modules will be processed as
// the foreach loop continues.
foreach ($module_list as $module => $value) {
foreach (array_keys($module_data[$module]->requires) as $dependency) {
if (!isset($module_data[$dependency])) {
// The dependency does not exist.
throw new MissingDependencyException("Unable to install modules: module '{$module}' is missing its dependency module {$dependency}.");
}
// Skip already installed modules.
if (!isset($module_list[$dependency]) && !isset($installed_modules[$dependency])) {
if ($module_data[$dependency]->info['core_incompatible']) {
throw new MissingDependencyException("Unable to install modules: module '{$module}'. Its dependency module '{$dependency}' is incompatible with this version of Drupal core.");
}
$module_list[$dependency] = $dependency;
}
}
}
// Set the actual module weights.
$module_list = array_map(function ($module) use ($module_data) {
return $module_data[$module]->sort;
}, $module_list);
// Sort the module list by their weights (reverse).
arsort($module_list);
$module_list = array_keys($module_list);
}
return array_values($module_list);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.