diff --git a/app/Services/PluginManager.php b/app/Services/PluginManager.php index 272d8bca..54f7bf1c 100644 --- a/app/Services/PluginManager.php +++ b/app/Services/PluginManager.php @@ -267,29 +267,35 @@ class PluginManager */ public function enable($plugin) { + /** @var Plugin|null */ $plugin = is_string($plugin) ? $this->get($plugin) : $plugin; - if ($plugin && !$plugin->isEnabled()) { - $unsatisfied = $this->getUnsatisfied($plugin); - $conflicts = $this->getConflicts($plugin); - if ($unsatisfied->isNotEmpty() || $conflicts->isNotEmpty()) { - return compact('unsatisfied', 'conflicts'); - } - - $this->enabled->put($plugin->name, ['version' => $plugin->version]); - $this->saveEnabled(); - - $plugin->setEnabled(true); - - $this->dispatcher->dispatch(new Events\PluginWasEnabled($plugin)); - - return true; - } else { + if (empty($plugin)) { return false; } + + if ($plugin->isEnabled()) { + return true; + } + + $unsatisfied = $this->getUnsatisfied($plugin); + $conflicts = $this->getConflicts($plugin); + if ($unsatisfied->isNotEmpty() || $conflicts->isNotEmpty()) { + return compact('unsatisfied', 'conflicts'); + } + + $this->enabled->put($plugin->name, ['version' => $plugin->version]); + $this->saveEnabled(); + + $plugin->setEnabled(true); + + $this->dispatcher->dispatch(new Events\PluginWasEnabled($plugin)); + + return true; } public function disable($plugin) { + /** @var Plugin|null */ $plugin = is_string($plugin) ? $this->get($plugin) : $plugin; if ($plugin && $plugin->isEnabled()) { $this->enabled->pull($plugin->name); diff --git a/tests/ServicesTest/PluginManagerTest.php b/tests/ServicesTest/PluginManagerTest.php index ca99e163..0e38c795 100644 --- a/tests/ServicesTest/PluginManagerTest.php +++ b/tests/ServicesTest/PluginManagerTest.php @@ -588,6 +588,10 @@ class PluginManagerTest extends TestCase $this->assertFalse($manager->enable('nope')); $this->assertTrue($manager->enable('fake')); + + // re-enable should be allowed + $this->assertTrue($manager->enable('fake')); + Event::assertDispatched(Events\PluginWasEnabled::class, function ($event) { $this->assertEquals('fake', $event->plugin->name);