From ff0ce096206bd5485897855a80b7a2396e42a8de Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Sat, 2 Jan 2016 15:03:11 +1030 Subject: [PATCH] Ensure routes are only populated after extensions have registered listeners Because extensions can have dependencies injected, a RouteCollection could potentially be instantiated, and thus the ConfigureRoutes event would be called before extensions have had a chance to subscribe to it. Instead, we instantiate the RouteCollection on demand, but only populate it when the application boots. --- src/Admin/AdminServiceProvider.php | 14 ++++++-------- src/Api/ApiServiceProvider.php | 14 ++++++-------- src/Forum/ForumServiceProvider.php | 14 ++++++-------- 3 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/Admin/AdminServiceProvider.php b/src/Admin/AdminServiceProvider.php index ea41ef82b..69f5c28a1 100644 --- a/src/Admin/AdminServiceProvider.php +++ b/src/Admin/AdminServiceProvider.php @@ -33,7 +33,7 @@ class AdminServiceProvider extends AbstractServiceProvider }); $this->app->singleton('flarum.admin.routes', function () { - return $this->getRoutes(); + return new RouteCollection; }); } @@ -42,6 +42,8 @@ class AdminServiceProvider extends AbstractServiceProvider */ public function boot() { + $this->populateRoutes($this->app->make('flarum.admin.routes')); + $this->loadViewsFrom(__DIR__.'/../../views', 'flarum.admin'); $this->flushAssetsWhenThemeChanged(); @@ -50,14 +52,12 @@ class AdminServiceProvider extends AbstractServiceProvider } /** - * Register the admin client routes. + * Populate the forum client routes. * - * @return RouteCollection + * @param RouteCollection $routes */ - protected function getRoutes() + protected function populateRoutes(RouteCollection $routes) { - $routes = new RouteCollection; - $toController = $this->getHandlerGenerator($this->app); $routes->get( @@ -65,8 +65,6 @@ class AdminServiceProvider extends AbstractServiceProvider 'index', $toController('Flarum\Admin\Controller\ClientController') ); - - return $routes; } protected function flushAssetsWhenThemeChanged() diff --git a/src/Api/ApiServiceProvider.php b/src/Api/ApiServiceProvider.php index 0bc8d6827..09012694b 100644 --- a/src/Api/ApiServiceProvider.php +++ b/src/Api/ApiServiceProvider.php @@ -36,7 +36,7 @@ class ApiServiceProvider extends AbstractServiceProvider }); $this->app->singleton('flarum.api.routes', function () { - return $this->getRoutes(); + return new RouteCollection; }); $this->app->singleton(ErrorHandler::class, function () { @@ -64,6 +64,8 @@ class ApiServiceProvider extends AbstractServiceProvider */ public function boot() { + $this->populateRoutes($this->app->make('flarum.api.routes')); + $this->registerNotificationSerializers(); AbstractSerializeController::setContainer($this->app); @@ -93,14 +95,12 @@ class ApiServiceProvider extends AbstractServiceProvider } /** - * Get the API routes. + * Populate the API routes. * - * @return RouteCollection + * @param RouteCollection $routes */ - protected function getRoutes() + protected function populateRoutes(RouteCollection $routes) { - $routes = new RouteCollection; - $toController = $this->getHandlerGenerator($this->app); // Get forum information @@ -366,7 +366,5 @@ class ApiServiceProvider extends AbstractServiceProvider $this->app->make('events')->fire( new ConfigureApiRoutes($routes, $toController) ); - - return $routes; } } diff --git a/src/Forum/ForumServiceProvider.php b/src/Forum/ForumServiceProvider.php index 62431ed2b..8719d1963 100644 --- a/src/Forum/ForumServiceProvider.php +++ b/src/Forum/ForumServiceProvider.php @@ -32,7 +32,7 @@ class ForumServiceProvider extends AbstractServiceProvider }); $this->app->singleton('flarum.forum.routes', function () { - return $this->getRoutes(); + return new RouteCollection; }); } @@ -41,6 +41,8 @@ class ForumServiceProvider extends AbstractServiceProvider */ public function boot() { + $this->populateRoutes($this->app->make('flarum.forum.routes')); + $this->loadViewsFrom(__DIR__.'/../../views', 'flarum.forum'); $this->flushAssetsWhenThemeChanged(); @@ -49,14 +51,12 @@ class ForumServiceProvider extends AbstractServiceProvider } /** - * Get the forum client routes. + * Populate the forum client routes. * - * @return RouteCollection + * @param RouteCollection $routes */ - protected function getRoutes() + protected function populateRoutes(RouteCollection $routes) { - $routes = new RouteCollection; - $toController = $this->getHandlerGenerator($this->app); $routes->get( @@ -140,8 +140,6 @@ class ForumServiceProvider extends AbstractServiceProvider 'default', $toDefaultController ); - - return $routes; } protected function flushAssetsWhenThemeChanged()