123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- declare(strict_types=1);
- namespace App\Providers;
- use App\Http\Middleware\GetTenancyByUsername;
- use Illuminate\Support\Facades\Event;
- use Illuminate\Support\Facades\Route;
- use Illuminate\Support\ServiceProvider;
- use Stancl\JobPipeline\JobPipeline;
- use Stancl\Tenancy\Events;
- use Stancl\Tenancy\Jobs;
- use Stancl\Tenancy\Listeners;
- use Stancl\Tenancy\Middleware;
- class TenancyServiceProvider extends ServiceProvider
- {
- // By default, no namespace is used to support the callable array syntax.
- public static string $controllerNamespace = '';
- public function events()
- {
- return [
- // Tenant events
- Events\CreatingTenant::class => [],
- Events\TenantCreated::class => [
- JobPipeline::make([
- Jobs\CreateDatabase::class,
- Jobs\MigrateDatabase::class,
- Jobs\SeedDatabase::class,
- // Your own jobs to prepare the tenant.
- // Provision API keys, create S3 buckets, anything you want!
- ])->send(function (Events\TenantCreated $event) {
- return $event->tenant;
- })->shouldBeQueued(), // `false` by default, but you probably want to make this `true` for production.
- ],
- Events\SavingTenant::class => [],
- Events\TenantSaved::class => [],
- Events\UpdatingTenant::class => [],
- Events\TenantUpdated::class => [],
- Events\DeletingTenant::class => [],
- Events\TenantDeleted::class => [
- JobPipeline::make([
- Jobs\DeleteDatabase::class,
- ])->send(function (Events\TenantDeleted $event) {
- return $event->tenant;
- })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production.
- ],
- // Domain events
- Events\CreatingDomain::class => [],
- Events\DomainCreated::class => [],
- Events\SavingDomain::class => [],
- Events\DomainSaved::class => [],
- Events\UpdatingDomain::class => [],
- Events\DomainUpdated::class => [],
- Events\DeletingDomain::class => [],
- Events\DomainDeleted::class => [],
- // Database events
- Events\DatabaseCreated::class => [],
- Events\DatabaseMigrated::class => [],
- Events\SeedingDatabase::class => [
- ],
- Events\DatabaseSeeded::class => [],
- Events\DatabaseRolledBack::class => [],
- Events\DatabaseDeleted::class => [],
- // Tenancy events
- Events\InitializingTenancy::class => [],
- Events\TenancyInitialized::class => [
- Listeners\BootstrapTenancy::class,
- ],
- Events\EndingTenancy::class => [],
- Events\TenancyEnded::class => [
- Listeners\RevertToCentralContext::class,
- ],
- Events\BootstrappingTenancy::class => [],
- Events\TenancyBootstrapped::class => [],
- Events\RevertingToCentralContext::class => [],
- Events\RevertedToCentralContext::class => [],
- // Resource syncing
- Events\SyncedResourceSaved::class => [
- Listeners\UpdateSyncedResource::class,
- ],
- // Fired only when a synced resource is changed in a different DB than the origin DB (to avoid infinite loops)
- Events\SyncedResourceChangedInForeignDatabase::class => [],
- ];
- }
- public function register()
- {
- //
- }
- public function boot()
- {
- $this->bootEvents();
- $this->mapRoutes();
- $this->makeTenancyMiddlewareHighestPriority();
- }
- protected function bootEvents()
- {
- foreach ($this->events() as $event => $listeners) {
- foreach ($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(static::$controllerNamespace)
- ->group(base_path('routes/tenant.php'));
- }
- });
- }
- protected function makeTenancyMiddlewareHighestPriority()
- {
- $tenancyMiddleware = [
- GetTenancyByUsername::class,
- // Even higher priority than the initialization middleware
- Middleware\PreventAccessFromCentralDomains::class,
- Middleware\InitializeTenancyByDomain::class,
- Middleware\InitializeTenancyBySubdomain::class,
- Middleware\InitializeTenancyByDomainOrSubdomain::class,
- Middleware\InitializeTenancyByPath::class,
- Middleware\InitializeTenancyByRequestData::class,
- ];
- foreach (array_reverse($tenancyMiddleware) as $middleware) {
- $this->app[\Illuminate\Contracts\Http\Kernel::class]->prependToMiddlewarePriority($middleware);
- }
- }
- }
|