config = $config; } public function subscribe(Dispatcher $events) { $events->listen($this->allBackupEventClasses(), function ($event) { $notifiable = $this->determineNotifiable(); $notification = $this->determineNotification($event); $notifiable->notify($notification); }); } protected function determineNotifiable() { $notifiableClass = $this->config->get('backup.notifications.notifiable'); return app($notifiableClass); } protected function determineNotification($event): Notification { $eventName = class_basename($event); $notificationClass = collect($this->config->get('backup.notifications.notifications')) ->keys() ->first(function ($notificationClass) use ($eventName) { $notificationName = class_basename($notificationClass); return $notificationName === $eventName; }); if (! $notificationClass) { throw NotificationCouldNotBeSent::noNotificationClassForEvent($event); } return new $notificationClass($event); } protected function allBackupEventClasses(): array { return [ BackupHasFailed::class, BackupWasSuccessful::class, CleanupHasFailed::class, CleanupWasSuccessful::class, HealthyBackupWasFound::class, UnhealthyBackupWasFound::class, ]; } }