diff --git a/framework/core/src/Extend/ServiceProvider.php b/framework/core/src/Extend/ServiceProvider.php new file mode 100644 index 000000000..b2767cdcb --- /dev/null +++ b/framework/core/src/Extend/ServiceProvider.php @@ -0,0 +1,40 @@ +providers[] = $serviceProviderClass; + + return $this; + } + + public function extend(Container $container, Extension $extension = null) + { + $app = $container->make('flarum'); + + foreach ($this->providers as $provider) { + $app->register($provider); + } + } +} diff --git a/framework/core/tests/integration/extenders/ServiceProviderTest.php b/framework/core/tests/integration/extenders/ServiceProviderTest.php new file mode 100644 index 000000000..72f3af0b6 --- /dev/null +++ b/framework/core/tests/integration/extenders/ServiceProviderTest.php @@ -0,0 +1,119 @@ +app(); + + $this->assertIsArray( + $this->app->getContainer()->make('flarum.forum.middleware') + ); + } + + /** + * @test + */ + public function providers_first_register_order_is_correct() + { + $this->extend( + (new Extend\ServiceProvider()) + ->register(CustomServiceProvider::class) + ); + + $this->app(); + + $this->assertEquals( + 'overriden_by_custom_provider_register', + $this->app->getContainer()->make('flarum.forum.middleware') + ); + } + + /** + * @test + */ + public function providers_second_register_order_is_correct() + { + $this->extend( + (new Extend\ServiceProvider()) + ->register(CustomServiceProvider::class) + ->register(SecondCustomServiceProvider::class) + ); + + $this->app(); + + $this->assertEquals( + 'overriden_by_second_custom_provider_register', + $this->app->getContainer()->make('flarum.forum.middleware') + ); + } + + /** + * @test + */ + public function providers_boot_order_is_correct() + { + $this->extend( + (new Extend\ServiceProvider()) + ->register(ThirdCustomProvider::class) + ->register(CustomServiceProvider::class) + ->register(SecondCustomServiceProvider::class) + ); + + $this->app(); + + $this->assertEquals( + 'overriden_by_third_custom_provider_boot', + $this->app->getContainer()->make('flarum.forum.middleware') + ); + } +} + +class CustomServiceProvider extends AbstractServiceProvider +{ + public function register() + { + // First we override the singleton here. + $this->app->extend('flarum.forum.middleware', function () { + return 'overriden_by_custom_provider_register'; + }); + } +} + +class SecondCustomServiceProvider extends AbstractServiceProvider +{ + public function register() + { + // Second we check that the singleton was overriden here. + $this->app->extend('flarum.forum.middleware', function ($forumRoutes) { + return 'overriden_by_second_custom_provider_register'; + }); + } +} + +class ThirdCustomProvider extends AbstractServiceProvider +{ + public function boot() + { + // Third we override one last time here, to make sure this is the final result. + $this->app->extend('flarum.forum.middleware', function ($forumRoutes) { + return 'overriden_by_third_custom_provider_boot'; + }); + } +}