From d97f7136df303ff3ff0c4fa0fe87fc2699cee2cd Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Thu, 13 Dec 2018 02:01:50 +0100 Subject: [PATCH] Inject dependencies when firing events, not before The event subscriber approach means that dependencies have to be injected (and thus instantiated, along with all *their* dependencies) at the time of registering event listeners - even when events are never fired within a request's lifecycle. This is unnecessary and causes more classes than necessary to be loaded. In this case, we can explicitly register event listeners that will resolve their dependencies when the event is fired, not before. Refs #1578. --- .../core/src/Admin/AdminServiceProvider.php | 32 +++++++++++++++--- framework/core/src/Extend/Frontend.php | 33 ++++++++++++++++--- .../core/src/Forum/ForumServiceProvider.php | 30 ++++++++++++++--- .../src/Frontend/RecompileFrontendAssets.php | 15 --------- 4 files changed, 80 insertions(+), 30 deletions(-) diff --git a/framework/core/src/Admin/AdminServiceProvider.php b/framework/core/src/Admin/AdminServiceProvider.php index 08c9348e1..ea727c2f0 100644 --- a/framework/core/src/Admin/AdminServiceProvider.php +++ b/framework/core/src/Admin/AdminServiceProvider.php @@ -12,8 +12,11 @@ namespace Flarum\Admin; use Flarum\Event\ConfigureMiddleware; +use Flarum\Extension\Event\Disabled; +use Flarum\Extension\Event\Enabled; use Flarum\Foundation\AbstractServiceProvider; use Flarum\Foundation\Application; +use Flarum\Foundation\Event\ClearingCache; use Flarum\Frontend\AddLocaleAssets; use Flarum\Frontend\AddTranslations; use Flarum\Frontend\Compiler\Source\SourceCollector; @@ -22,6 +25,8 @@ use Flarum\Http\Middleware as HttpMiddleware; use Flarum\Http\RouteCollection; use Flarum\Http\RouteHandlerFactory; use Flarum\Http\UrlGenerator; +use Flarum\Locale\LocaleManager; +use Flarum\Settings\Event\Saved; use Zend\Stratigility\MiddlewarePipe; class AdminServiceProvider extends AbstractServiceProvider @@ -102,11 +107,28 @@ class AdminServiceProvider extends AbstractServiceProvider $this->loadViewsFrom(__DIR__.'/../../views', 'flarum.admin'); - $this->app->make('events')->subscribe( - new RecompileFrontendAssets( - $this->app->make('flarum.assets.admin'), - $this->app->make('flarum.locales') - ) + $events = $this->app->make('events'); + + $events->listen( + [Enabled::class, Disabled::class, ClearingCache::class], + function () { + $recompile = new RecompileFrontendAssets( + $this->app->make('flarum.assets.admin'), + $this->app->make(LocaleManager::class) + ); + $recompile->flush(); + } + ); + + $events->listen( + Saved::class, + function (Saved $event) { + $recompile = new RecompileFrontendAssets( + $this->app->make('flarum.assets.admin'), + $this->app->make(LocaleManager::class) + ); + $recompile->whenSettingsSaved($event); + } ); } diff --git a/framework/core/src/Extend/Frontend.php b/framework/core/src/Extend/Frontend.php index cd3d0abc0..90ca00559 100644 --- a/framework/core/src/Extend/Frontend.php +++ b/framework/core/src/Extend/Frontend.php @@ -11,13 +11,18 @@ namespace Flarum\Extend; +use Flarum\Extension\Event\Disabled; +use Flarum\Extension\Event\Enabled; use Flarum\Extension\Extension; +use Flarum\Foundation\Event\ClearingCache; use Flarum\Frontend\Assets; use Flarum\Frontend\Compiler\Source\SourceCollector; use Flarum\Frontend\Frontend as ActualFrontend; use Flarum\Frontend\RecompileFrontendAssets; use Flarum\Http\RouteCollection; use Flarum\Http\RouteHandlerFactory; +use Flarum\Locale\LocaleManager; +use Flarum\Settings\Event\Saved; use Illuminate\Contracts\Container\Container; class Frontend implements ExtenderInterface @@ -108,11 +113,29 @@ class Frontend implements ExtenderInterface return $container->make('flarum.assets.factory')($this->frontend); }); - $container->make('events')->subscribe( - new RecompileFrontendAssets( - $container->make($abstract), - $container->make('flarum.locales') - ) + /** @var \Illuminate\Contracts\Events\Dispatcher $events */ + $events = $container->make('events'); + + $events->listen( + [Enabled::class, Disabled::class, ClearingCache::class], + function () use ($container, $abstract) { + $recompile = new RecompileFrontendAssets( + $container->make($abstract), + $container->make(LocaleManager::class) + ); + $recompile->flush(); + } + ); + + $events->listen( + Saved::class, + function (Saved $event) use ($container, $abstract) { + $recompile = new RecompileFrontendAssets( + $container->make($abstract), + $container->make(LocaleManager::class) + ); + $recompile->whenSettingsSaved($event); + } ); } } diff --git a/framework/core/src/Forum/ForumServiceProvider.php b/framework/core/src/Forum/ForumServiceProvider.php index 2d40259d9..94ee49d5b 100644 --- a/framework/core/src/Forum/ForumServiceProvider.php +++ b/framework/core/src/Forum/ForumServiceProvider.php @@ -13,9 +13,12 @@ namespace Flarum\Forum; use Flarum\Event\ConfigureForumRoutes; use Flarum\Event\ConfigureMiddleware; +use Flarum\Extension\Event\Disabled; +use Flarum\Extension\Event\Enabled; use Flarum\Formatter\Formatter; use Flarum\Foundation\AbstractServiceProvider; use Flarum\Foundation\Application; +use Flarum\Foundation\Event\ClearingCache; use Flarum\Frontend\AddLocaleAssets; use Flarum\Frontend\AddTranslations; use Flarum\Frontend\Assets; @@ -25,6 +28,8 @@ use Flarum\Http\Middleware as HttpMiddleware; use Flarum\Http\RouteCollection; use Flarum\Http\RouteHandlerFactory; use Flarum\Http\UrlGenerator; +use Flarum\Locale\LocaleManager; +use Flarum\Settings\Event\Saved; use Flarum\Settings\SettingsRepositoryInterface; use Symfony\Component\Translation\TranslatorInterface; use Zend\Stratigility\MiddlewarePipe; @@ -116,11 +121,26 @@ class ForumServiceProvider extends AbstractServiceProvider $events = $this->app->make('events'); - $events->subscribe( - new RecompileFrontendAssets( - $this->app->make('flarum.assets.forum'), - $this->app->make('flarum.locales') - ) + $events->listen( + [Enabled::class, Disabled::class, ClearingCache::class], + function () { + $recompile = new RecompileFrontendAssets( + $this->app->make('flarum.assets.forum'), + $this->app->make(LocaleManager::class) + ); + $recompile->flush(); + } + ); + + $events->listen( + Saved::class, + function (Saved $event) { + $recompile = new RecompileFrontendAssets( + $this->app->make('flarum.assets.forum'), + $this->app->make(LocaleManager::class) + ); + $recompile->whenSettingsSaved($event); + } ); $events->subscribe( diff --git a/framework/core/src/Frontend/RecompileFrontendAssets.php b/framework/core/src/Frontend/RecompileFrontendAssets.php index 9351da9bc..8fb372695 100644 --- a/framework/core/src/Frontend/RecompileFrontendAssets.php +++ b/framework/core/src/Frontend/RecompileFrontendAssets.php @@ -11,12 +11,8 @@ namespace Flarum\Frontend; -use Flarum\Extension\Event\Disabled; -use Flarum\Extension\Event\Enabled; -use Flarum\Foundation\Event\ClearingCache; use Flarum\Locale\LocaleManager; use Flarum\Settings\Event\Saved; -use Illuminate\Contracts\Events\Dispatcher; class RecompileFrontendAssets { @@ -40,17 +36,6 @@ class RecompileFrontendAssets $this->locales = $locales; } - /** - * @param Dispatcher $events - */ - public function subscribe(Dispatcher $events) - { - $events->listen(Saved::class, [$this, 'whenSettingsSaved']); - $events->listen(Enabled::class, [$this, 'flush']); - $events->listen(Disabled::class, [$this, 'flush']); - $events->listen(ClearingCache::class, [$this, 'flush']); - } - public function whenSettingsSaved(Saved $event) { if (preg_grep('/^theme_/i', array_keys($event->settings))) {