TenancyServiceProvider.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Providers;
  4. use Illuminate\Support\Facades\Event;
  5. use Illuminate\Support\Facades\Route;
  6. use Illuminate\Support\ServiceProvider;
  7. use Stancl\JobPipeline\JobPipeline;
  8. use Stancl\Tenancy\Events;
  9. use Stancl\Tenancy\Jobs;
  10. use Stancl\Tenancy\Listeners;
  11. use Stancl\Tenancy\Middleware;
  12. class TenancyServiceProvider extends ServiceProvider
  13. {
  14. // By default, no namespace is used to support the callable array syntax.
  15. public static string $controllerNamespace = '';
  16. public function events()
  17. {
  18. return [
  19. // Tenant events
  20. Events\CreatingTenant::class => [],
  21. Events\TenantCreated::class => [
  22. JobPipeline::make([
  23. Jobs\CreateDatabase::class,
  24. Jobs\MigrateDatabase::class,
  25. // Jobs\SeedDatabase::class,
  26. // Your own jobs to prepare the tenant.
  27. // Provision API keys, create S3 buckets, anything you want!
  28. ])->send(function (Events\TenantCreated $event) {
  29. return $event->tenant;
  30. })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production.
  31. ],
  32. Events\SavingTenant::class => [],
  33. Events\TenantSaved::class => [],
  34. Events\UpdatingTenant::class => [],
  35. Events\TenantUpdated::class => [],
  36. Events\DeletingTenant::class => [],
  37. Events\TenantDeleted::class => [
  38. JobPipeline::make([
  39. Jobs\DeleteDatabase::class,
  40. ])->send(function (Events\TenantDeleted $event) {
  41. return $event->tenant;
  42. })->shouldBeQueued(false), // `false` by default, but you probably want to make this `true` for production.
  43. ],
  44. // Domain events
  45. Events\CreatingDomain::class => [],
  46. Events\DomainCreated::class => [],
  47. Events\SavingDomain::class => [],
  48. Events\DomainSaved::class => [],
  49. Events\UpdatingDomain::class => [],
  50. Events\DomainUpdated::class => [],
  51. Events\DeletingDomain::class => [],
  52. Events\DomainDeleted::class => [],
  53. // Database events
  54. Events\DatabaseCreated::class => [],
  55. Events\DatabaseMigrated::class => [],
  56. Events\DatabaseSeeded::class => [],
  57. Events\DatabaseRolledBack::class => [],
  58. Events\DatabaseDeleted::class => [],
  59. // Tenancy events
  60. Events\InitializingTenancy::class => [],
  61. Events\TenancyInitialized::class => [
  62. Listeners\BootstrapTenancy::class,
  63. ],
  64. Events\EndingTenancy::class => [],
  65. Events\TenancyEnded::class => [
  66. Listeners\RevertToCentralContext::class,
  67. ],
  68. Events\BootstrappingTenancy::class => [],
  69. Events\TenancyBootstrapped::class => [],
  70. Events\RevertingToCentralContext::class => [],
  71. Events\RevertedToCentralContext::class => [],
  72. // Resource syncing
  73. Events\SyncedResourceSaved::class => [
  74. Listeners\UpdateSyncedResource::class,
  75. ],
  76. // Fired only when a synced resource is changed in a different DB than the origin DB (to avoid infinite loops)
  77. Events\SyncedResourceChangedInForeignDatabase::class => [],
  78. ];
  79. }
  80. public function register()
  81. {
  82. //
  83. }
  84. public function boot()
  85. {
  86. $this->bootEvents();
  87. $this->mapRoutes();
  88. $this->makeTenancyMiddlewareHighestPriority();
  89. }
  90. protected function bootEvents()
  91. {
  92. foreach ($this->events() as $event => $listeners) {
  93. foreach ($listeners as $listener) {
  94. if ($listener instanceof JobPipeline) {
  95. $listener = $listener->toListener();
  96. }
  97. Event::listen($event, $listener);
  98. }
  99. }
  100. }
  101. protected function mapRoutes()
  102. {
  103. $this->app->booted(function () {
  104. if (file_exists(base_path('routes/tenant.php'))) {
  105. Route::namespace(static::$controllerNamespace)
  106. ->group(base_path('routes/tenant.php'));
  107. }
  108. });
  109. }
  110. protected function makeTenancyMiddlewareHighestPriority()
  111. {
  112. $tenancyMiddleware = [
  113. // Even higher priority than the initialization middleware
  114. Middleware\PreventAccessFromCentralDomains::class,
  115. Middleware\InitializeTenancyByDomain::class,
  116. Middleware\InitializeTenancyBySubdomain::class,
  117. Middleware\InitializeTenancyByDomainOrSubdomain::class,
  118. Middleware\InitializeTenancyByPath::class,
  119. Middleware\InitializeTenancyByRequestData::class,
  120. ];
  121. foreach (array_reverse($tenancyMiddleware) as $middleware) {
  122. $this->app[\Illuminate\Contracts\Http\Kernel::class]->prependToMiddlewarePriority($middleware);
  123. }
  124. }
  125. }