[ JobPipeline::make([ CreateDatabase::class, MigrateDatabase::class, // triggers DatabaseMigrated event SeedDatabase::class, ])->send(function (TenantCreated $event) { return $event->tenant; })->queue(true), ], DatabaseCreated::class => [], DatabaseMigrated::class => [], DatabaseSeeded::class => [], TenantDeleted::class => [ JobPipeline::make([ DeleteDatabase::class, ])->send(function (TenantDeleted $event) { return $event->tenant; })->queue(true), // DeleteStorage::class, ], DatabaseDeleted::class => [], ]; } public function register() { // } public function boot() { $this->bootEvents(); // } protected function bootEvents() { foreach ($this->events() as $event => $listeners) { foreach (array_unique($listeners) as $listener) { // Technically, the string|Closure typehint is not enforced by // Laravel, but for type correctness, we wrap callables in // simple Closures, to match Laravel's docblock typehint. if (is_callable($listener) && !$listener instanceof Closure) { $listener = function ($event) use ($listener) { $listener($event); }; } Event::listen($event, $listener); } } } }