From 232164be2fce58012477587edf25936a62d21e59 Mon Sep 17 00:00:00 2001 From: Martin Kluska Date: Sun, 23 Jun 2024 13:08:48 +0200 Subject: [PATCH] fix(ServiceProvider): Do not use EventServiceProvider as base and replicate $listen BREAKING CHANGE: add array to $listen to your service provider --- src/Providers/AbstractBaseServiceProvider.php | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Providers/AbstractBaseServiceProvider.php b/src/Providers/AbstractBaseServiceProvider.php index 3e101d11..16acfd4b 100644 --- a/src/Providers/AbstractBaseServiceProvider.php +++ b/src/Providers/AbstractBaseServiceProvider.php @@ -4,7 +4,10 @@ namespace LaraStrict\Providers; +use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Foundation\Support\Providers\EventServiceProvider; +use Illuminate\Support\Facades\Event; +use Illuminate\Support\ServiceProvider; use LaraStrict\Contracts\AppServiceProviderPipeContract; use LaraStrict\Contracts\CreateAppServiceProviderActionContract; use LaraStrict\Contracts\RunAppServiceProviderPipesActionContract; @@ -12,10 +15,21 @@ use LaraStrict\Providers\Entities\AppServiceProviderEntity; use LogicException; -abstract class AbstractBaseServiceProvider extends EventServiceProvider +/** + * From Laravel 10+ the EventServiceProvider cant be used anymore, it was designed to be used only once + * within app/Providers/EventServiceProvider.php. We are using $listen shortcut so let's use similar implementation. + */ +abstract class AbstractBaseServiceProvider extends ServiceProvider { protected AppServiceProviderEntity|null $appServiceProvider = null; + /** + * The event handler mappings for the application. + * + * @var array> + */ + protected array $listen = []; + public function register(): void { parent::register(); @@ -24,12 +38,22 @@ public function register(): void assert($runPipes instanceof RunAppServiceProviderPipesActionContract); $runPipes->execute($this->getAppServiceProvider(), $this->registerPipes()); + + $this->booting(function () { + $events = $this->app->make(Dispatcher::class); + assert($events instanceof Dispatcher); + + // Taken from vendor/laravel/framework/src/Illuminate/Foundation/Support/Providers/EventServiceProvider.php + foreach ($this->listen as $event => $listeners) { + foreach (array_unique($listeners, SORT_REGULAR) as $listener) { + $events->listen($event, $listener); + } + } + }); } public function boot(): void { - parent::boot(); - $runPipes = $this->app->make(RunAppServiceProviderPipesActionContract::class); assert($runPipes instanceof RunAppServiceProviderPipesActionContract);