function ModuleInstaller::getModulesToInstall

File

core/lib/Drupal/Core/Extension/ModuleInstaller.php, line 110

Class

ModuleInstaller
Default implementation of the module installer.

Namespace

Drupal\Core\Extension

Code

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.