/** * Processes an extension change. * * @param string $type * The type of extension, either 'module' or 'theme'. * @param string $op * The change operation. * @param string $name * The name of the extension to process. */ protected function processExtension($type, $op, $name) { // Set the config installer to use the staging directory instead of the // extensions own default config directories. \Drupal::service('config.installer')->setSyncing(TRUE)->setSourceStorage($this->storageComparer->getSourceStorage()); if ($type == 'module') { $this->moduleInstaller->{$op}(array($name), FALSE); // Installing a module can cause a kernel boot therefore reinject all the // services. $this->reInjectMe(); // During a module install or uninstall the container is rebuilt and the // module handler is called from drupal_get_complete_schema(). This causes // the container's instance of the module handler not to have loaded all // the enabled modules. $this->moduleHandler->loadAll(); } if ($type == 'theme') { // Theme uninstalls possible remove default or admin themes therefore we // need to import this before doing any. If there are no uninstalls and // the default or admin theme is changing this will be picked up whilst // processing configuration. if ($op == 'uninstall' && $this->processedSystemTheme === FALSE) { $this->importConfig(StorageInterface::DEFAULT_COLLECTION, 'update', 'system.theme'); $this->configManager->getConfigFactory()->reset('system.theme'); $this->processedSystemTheme = TRUE; } $this->themeHandler->{$op}(array($name)); } $this->setProcessedExtension($type, $op, $name); \Drupal::service('config.installer')->setSyncing(FALSE); }