diff --git a/framework/core/src/Extend/Formatter.php b/framework/core/src/Extend/Formatter.php index 243f54d81..1ae2a6ed8 100644 --- a/framework/core/src/Extend/Formatter.php +++ b/framework/core/src/Extend/Formatter.php @@ -11,15 +11,13 @@ namespace Flarum\Extend; -use Flarum\Extension\Event\Disabled; -use Flarum\Extension\Event\Enabled; use Flarum\Extension\Extension; use Flarum\Formatter\Event\Configuring; use Flarum\Formatter\Formatter as ActualFormatter; use Illuminate\Contracts\Container\Container; use Illuminate\Events\Dispatcher; -class Formatter implements ExtenderInterface +class Formatter implements ExtenderInterface, LifecycleInterface { protected $callback; @@ -40,16 +38,17 @@ class Formatter implements ExtenderInterface call_user_func($this->callback, $event->configurator); } ); + } - // Also set up an event listener to flush the formatter cache whenever - // this extension is enabled or disabled. - $events->listen( - [Enabled::class, Disabled::class], - function ($event) use ($container, $extension) { - if ($event->extension === $extension) { - $container->make(ActualFormatter::class)->flush(); - } - } - ); + public function onEnable(Container $container, Extension $extension) + { + // FLush the formatter cache when this extension is enabled + $container->make(ActualFormatter::class)->flush(); + } + + public function onDisable(Container $container, Extension $extension) + { + // FLush the formatter cache when this extension is disabled + $container->make(ActualFormatter::class)->flush(); } } diff --git a/framework/core/src/Extend/LifecycleInterface.php b/framework/core/src/Extend/LifecycleInterface.php new file mode 100644 index 000000000..cbe8a96e4 --- /dev/null +++ b/framework/core/src/Extend/LifecycleInterface.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Flarum\Extend; + +use Flarum\Extension\Extension; +use Illuminate\Contracts\Container\Container; + +interface LifecycleInterface +{ + public function onEnable(Container $container, Extension $extension); + + public function onDisable(Container $container, Extension $extension); +} diff --git a/framework/core/src/Extension/Extension.php b/framework/core/src/Extension/Extension.php index 89b0a90a4..f29885ce8 100644 --- a/framework/core/src/Extension/Extension.php +++ b/framework/core/src/Extension/Extension.php @@ -12,6 +12,7 @@ namespace Flarum\Extension; use Flarum\Extend\Compat; +use Flarum\Extend\LifecycleInterface; use Illuminate\Contracts\Container\Container; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Arr; @@ -223,6 +224,24 @@ class Extension implements Arrayable return $icon; } + public function enable(Container $container) + { + $this->setEnabled(true); + + foreach ($this->getLifecycleExtenders() as $extender) { + $extender->onEnable($container, $this); + } + } + + public function disable(Container $container) + { + $this->setEnabled(false); + + foreach ($this->getLifecycleExtenders() as $extender) { + $extender->onDisable($container, $this); + } + } + /** * @param bool $enabled * @return Extension @@ -277,6 +296,19 @@ class Extension implements Arrayable return array_flatten($extenders); } + /** + * @return LifecycleInterface[] + */ + private function getLifecycleExtenders(): array + { + return array_filter( + $this->getExtenders(), + function ($extender) { + return $extender instanceof LifecycleInterface; + } + ); + } + private function getExtenderFile(): ?string { $filename = "{$this->path}/extend.php"; diff --git a/framework/core/src/Extension/ExtensionManager.php b/framework/core/src/Extension/ExtensionManager.php index 6ca5aed90..f5f4c9117 100644 --- a/framework/core/src/Extension/ExtensionManager.php +++ b/framework/core/src/Extension/ExtensionManager.php @@ -128,7 +128,7 @@ class ExtensionManager $this->setEnabled($enabled); - $extension->setEnabled(true); + $extension->enable($this->app); $this->dispatcher->dispatch(new Enabled($extension)); } @@ -152,7 +152,7 @@ class ExtensionManager $this->setEnabled($enabled); - $extension->setEnabled(false); + $extension->disable($this->app); $this->dispatcher->dispatch(new Disabled($extension)); }