diff --git a/src/Providers/AddonServiceProvider.php b/src/Providers/AddonServiceProvider.php index 3e43690926..b3207fb5c2 100644 --- a/src/Providers/AddonServiceProvider.php +++ b/src/Providers/AddonServiceProvider.php @@ -225,13 +225,32 @@ public function bootAddon() public function bootEvents() { - foreach ($this->listen as $event => $listeners) { - foreach ($listeners as $listener) { - Event::listen($event, $listener); - } - } + collect($this->autoloadFilesFromFolder('Listeners')) + ->mapWithKeys(function ($class) { + $reflection = new \ReflectionClass($class); + + if ( + ! $reflection->hasMethod('handle') + || ! isset($reflection->getMethod('handle')->getParameters()[0]) + || ! $reflection->getMethod('handle')->getParameters()[0]->hasType() + ) { + return []; + } + + $event = $reflection->getMethod('handle')->getParameters()[0]->getType()->getName(); + + return [$event => $class]; + }) + ->filter() + ->merge(collect($this->listen)->flatMap(fn ($listeners, $event) => collect($listeners)->mapWithKeys(fn ($listener) => [$event => $listener]))) + ->unique() + ->each(fn ($listener, $event) => Event::listen($event, $listener)); + + $subscribers = collect($this->subscribe) + ->merge($this->autoloadFilesFromFolder('Subscribers')) + ->unique(); - foreach ($this->subscribe as $subscriber) { + foreach ($subscribers as $subscriber) { Event::subscribe($subscriber); } @@ -726,7 +745,7 @@ protected function bootFieldsets() return $this; } - protected function autoloadFilesFromFolder($folder, $requiredClass) + protected function autoloadFilesFromFolder($folder, $requiredClass = null) { try { $addon = $this->getAddon(); @@ -757,9 +776,11 @@ protected function autoloadFilesFromFolder($folder, $requiredClass) continue; } - if (is_subclass_of($fqcn, $requiredClass)) { - $autoloadable[] = $fqcn; + if ($requiredClass && ! is_subclass_of($fqcn, $requiredClass)) { + return; } + + $autoloadable[] = $fqcn; } return $autoloadable;