Skip to content

Commit

Permalink
[5.x] Autoload event listeners and subscribers (#10911)
Browse files Browse the repository at this point in the history
Co-authored-by: duncanmcclean <duncanmcclean@users.noreply.github.com>
  • Loading branch information
duncanmcclean and duncanmcclean authored Oct 21, 2024
1 parent 0458d9e commit bd1b44e
Showing 1 changed file with 30 additions and 9 deletions.
39 changes: 30 additions & 9 deletions src/Providers/AddonServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down Expand Up @@ -726,7 +745,7 @@ protected function bootFieldsets()
return $this;
}

protected function autoloadFilesFromFolder($folder, $requiredClass)
protected function autoloadFilesFromFolder($folder, $requiredClass = null)
{
try {
$addon = $this->getAddon();
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit bd1b44e

Please sign in to comment.