[ JobPipeline::make([ CreateDatabase::class, MigrateDatabase::class, SeedDatabase::class, // Your own jobs to prepare the tenant. // Provision API keys, create S3 buckets, anything you want! ])->send(function (TenantCreated $event) { return $event->tenant; })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production. ], TenantSaved::class => [], TenantUpdated::class => [], TenantDeleted::class => [ JobPipeline::make([ DeleteDatabase::class, ])->send(function (TenantDeleted $event) { return $event->tenant; })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production. ], DomainCreated::class => [], DomainSaved::class => [], DomainUpdated::class => [], DomainDeleted::class => [], DatabaseCreated::class => [], DatabaseMigrated::class => [], DatabaseSeeded::class => [], DatabaseRolledBack::class => [], DatabaseDeleted::class => [], TenancyInitialized::class => [ BootstrapTenancy::class, ], TenancyEnded::class => [ RevertToCentralContext::class, ], TenancyBootstrapped::class => [], RevertedToCentralContext::class => [], ]; } public function register() { // } public function boot() { $this->bootEvents(); $this->mapRoutes(); // } protected function bootEvents() { foreach ($this->events() as $event => $listeners) { foreach (array_unique($listeners) as $listener) { if ($listener instanceof JobPipeline) { $listener = $listener->toListener(); } Event::listen($event, $listener); } } } protected function mapRoutes() { $this->app->booted(function () { if (file_exists(base_path('routes/tenant.php'))) { Route::namespace($this->app['config']['tenancy.tenant_route_namespace'] ?? 'App\Http\Controllers') ->group(base_path('routes/tenant.php')); } }); } }