mirror of
https://github.com/flarum/core.git
synced 2025-10-14 16:34:26 +02:00
Basic Extension Dependency Support (#2188)
- Don't enable an extension if its dependencies are not enabled - Don't disable an extension if its dependencies are not disabled
This commit is contained in:
committed by
GitHub
parent
0a6c5217c1
commit
84d14f485a
@@ -83,11 +83,18 @@ class ExtensionManager
|
||||
// Composer 2.0 changes the structure of the installed.json manifest
|
||||
$installed = $installed['packages'] ?? $installed;
|
||||
|
||||
// We calculate and store a set of composer package names for all installed Flarum extensions,
|
||||
// so we know what is and isn't a flarum extension in `calculateDependencies`.
|
||||
// Using keys of an associative array allows us to do these checks in constant time.
|
||||
$installedSet = [];
|
||||
|
||||
foreach ($installed as $package) {
|
||||
if (Arr::get($package, 'type') != 'flarum-extension' || empty(Arr::get($package, 'name'))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$installedSet[Arr::get($package, 'name')] = true;
|
||||
|
||||
$path = isset($package['install-path'])
|
||||
? $this->paths->vendor.'/composer/'.$package['install-path']
|
||||
: $this->paths->vendor.'/'.Arr::get($package, 'name');
|
||||
@@ -101,6 +108,11 @@ class ExtensionManager
|
||||
|
||||
$extensions->put($extension->getId(), $extension);
|
||||
}
|
||||
|
||||
foreach ($extensions as $extension) {
|
||||
$extension->calculateDependencies($installedSet);
|
||||
}
|
||||
|
||||
$this->extensions = $extensions->sortBy(function ($extension, $name) {
|
||||
return $extension->composerJsonAttribute('extra.flarum-extension.title');
|
||||
});
|
||||
@@ -133,17 +145,27 @@ class ExtensionManager
|
||||
|
||||
$extension = $this->getExtension($name);
|
||||
|
||||
$missingDependencies = [];
|
||||
$enabledIds = $this->getEnabled();
|
||||
foreach ($extension->getExtensionDependencyIds() as $dependencyId) {
|
||||
if (! in_array($dependencyId, $enabledIds)) {
|
||||
$missingDependencies[] = $this->getExtension($dependencyId);
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($missingDependencies)) {
|
||||
throw new Exception\MissingDependenciesException($extension, $missingDependencies);
|
||||
}
|
||||
|
||||
$this->dispatcher->dispatch(new Enabling($extension));
|
||||
|
||||
$enabled = $this->getEnabled();
|
||||
|
||||
$enabled[] = $name;
|
||||
$enabledIds[] = $name;
|
||||
|
||||
$this->migrate($extension);
|
||||
|
||||
$this->publishAssets($extension);
|
||||
|
||||
$this->setEnabled($enabled);
|
||||
$this->setEnabled($enabledIds);
|
||||
|
||||
$extension->enable($this->container);
|
||||
|
||||
@@ -165,6 +187,18 @@ class ExtensionManager
|
||||
|
||||
$extension = $this->getExtension($name);
|
||||
|
||||
$dependentExtensions = [];
|
||||
|
||||
foreach ($this->getEnabledExtensions() as $possibleDependent) {
|
||||
if (in_array($extension->getId(), $possibleDependent->getExtensionDependencyIds())) {
|
||||
$dependentExtensions[] = $possibleDependent;
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($dependentExtensions)) {
|
||||
throw new Exception\DependentExtensionsException($extension, $dependentExtensions);
|
||||
}
|
||||
|
||||
$this->dispatcher->dispatch(new Disabling($extension));
|
||||
|
||||
unset($enabled[$k]);
|
||||
|
Reference in New Issue
Block a user