Recalculate enabled extensions and their dependencies if some listed in settings aren't installed (#2629)

This commit is contained in:
Alexander Skvortsov 2021-02-23 17:57:53 -05:00 committed by GitHub
parent 75359162c6
commit 2b69deef72

View File

@ -115,6 +115,21 @@ class ExtensionManager
$extension->calculateDependencies($installedSet, $enabledIds); $extension->calculateDependencies($installedSet, $enabledIds);
} }
$needsReset = false;
$enabledExtensions = [];
foreach ($this->getEnabled() as $enabledKey) {
$extension = $extensions->get($enabledKey);
if (is_null($extension)) {
$needsReset = true;
} else {
$enabledExtensions[] = $extension;
}
}
if ($needsReset) {
$this->setEnabledExtensions($enabledExtensions);
}
$this->extensions = $extensions->sortBy(function ($extension, $name) { $this->extensions = $extensions->sortBy(function ($extension, $name) {
return $extension->getTitle(); return $extension->getTitle();
}); });
@ -161,13 +176,13 @@ class ExtensionManager
$this->dispatcher->dispatch(new Enabling($extension)); $this->dispatcher->dispatch(new Enabling($extension));
$enabledIds[] = $name;
$this->migrate($extension); $this->migrate($extension);
$this->publishAssets($extension); $this->publishAssets($extension);
$this->setEnabled($enabledIds); $enabledExtensions = $this->getEnabledExtensions();
$enabledExtensions[] = $extension;
$this->setEnabledExtensions($enabledExtensions);
$extension->enable($this->container); $extension->enable($this->container);
@ -181,17 +196,16 @@ class ExtensionManager
*/ */
public function disable($name) public function disable($name)
{ {
$enabled = $this->getEnabled(); $extension = $this->getExtension($name);
$enabledExtensions = $this->getEnabledExtensions();
if (($k = array_search($name, $enabled)) === false) { if (($k = array_search($extension, $enabledExtensions)) === false) {
return; return;
} }
$extension = $this->getExtension($name);
$dependentExtensions = []; $dependentExtensions = [];
foreach ($this->getEnabledExtensions() as $possibleDependent) { foreach ($enabledExtensions as $possibleDependent) {
if (in_array($extension->getId(), $possibleDependent->getExtensionDependencyIds())) { if (in_array($extension->getId(), $possibleDependent->getExtensionDependencyIds())) {
$dependentExtensions[] = $possibleDependent; $dependentExtensions[] = $possibleDependent;
} }
@ -203,9 +217,8 @@ class ExtensionManager
$this->dispatcher->dispatch(new Disabling($extension)); $this->dispatcher->dispatch(new Disabling($extension));
unset($enabled[$k]); unset($enabledExtensions[$k]);
$this->setEnabledExtensions($enabledExtensions);
$this->setEnabled($enabled);
$extension->disable($this->container); $extension->disable($this->container);
@ -350,15 +363,11 @@ class ExtensionManager
/** /**
* Persist the currently enabled extensions. * Persist the currently enabled extensions.
* *
* @param array $enabledIds * @param array $enabledExtensions
*/ */
protected function setEnabled(array $enabledIds) protected function setEnabledExtensions(array $enabledExtensions)
{ {
$enabled = array_map(function ($id) { $sortedEnabled = static::resolveExtensionOrder($enabledExtensions)['valid'];
return $this->getExtension($id);
}, array_unique($enabledIds));
$sortedEnabled = static::resolveExtensionOrder($enabled)['valid'];
$sortedEnabledIds = array_map(function (Extension $extension) { $sortedEnabledIds = array_map(function (Extension $extension) {
return $extension->getId(); return $extension->getId();