File: /home/eslinced-103/brise-edu.or.kr/app/Providers/TenancyServiceProvider.php
<?php
namespace App\Providers;
use App\Amuz\EventListeners\PermissionBootstraper;
use App\Amuz\EventListeners\PermissionEnded;
use App\Http\Middleware\InitializeTenancyByNovaDomain;
use App\Jobs\AddDomainToPloi;
use App\Jobs\CreateTenantAdmin;
use App\Jobs\InvalidateDomainTenantResolverCache;
use App\Jobs\RemoveDomainFromPloi;
use Illuminate\Contracts\Http\Kernel;
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\Events\DatabaseCreated;
use Stancl\Tenancy\Events\DatabaseDeleted;
use Stancl\Tenancy\Events\DomainCreated;
use Stancl\Tenancy\Events\DomainDeleted;
use Stancl\Tenancy\Events\DomainSaved;
use Stancl\Tenancy\Jobs;
use Stancl\Tenancy\Listeners;
use Stancl\Tenancy\Middleware;
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
class TenancyServiceProvider extends ServiceProvider
{
public function events()
{
return [
// Tenant events
Events\CreatingTenant::class => [],
Events\TenantCreated::class => [
JobPipeline::make([
Jobs\CreateDatabase::class,
Jobs\MigrateDatabase::class,
CreateTenantAdmin::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(true), // `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(true), // `false` by default, but you probably want to make this `true` for production.
],
// Domain events
Events\CreatingDomain::class => [],
Events\DomainCreated::class => [
JobPipeline::make([
AddDomainToPloi::class,
])->send(function (DomainCreated $event) {
return $event->domain;
})->shouldBeQueued(false),
],
Events\SavingDomain::class => [],
Events\DomainSaved::class => [
JobPipeline::make([
InvalidateDomainTenantResolverCache::class,
])->send(function (DomainSaved $event) {
return $event->domain;
})->shouldBeQueued(false),
],
Events\UpdatingDomain::class => [],
Events\DomainUpdated::class => [],
Events\DeletingDomain::class => [],
Events\DomainDeleted::class => [
JobPipeline::make([
InvalidateDomainTenantResolverCache::class,
RemoveDomainFromPloi::class,
])->send(function (DomainDeleted $event) {
return $event->domain;
})->shouldBeQueued(false),
],
// Database events
Events\DatabaseCreated::class => [
function (DatabaseCreated $event) {
ploi()->acknowledgeDatabase($event->tenant->database()->getName());
},
],
Events\DatabaseMigrated::class => [],
Events\DatabaseSeeded::class => [],
Events\DatabaseRolledBack::class => [],
Events\DatabaseDeleted::class => [
function (DatabaseDeleted $event) {
ploi()->forgetDatabase($event->tenant->database()->getName());
},
],
// Tenancy events
Events\InitializingTenancy::class => [],
Events\TenancyInitialized::class => [
Listeners\BootstrapTenancy::class,
],
Events\EndingTenancy::class => [],
Events\TenancyEnded::class => [
Listeners\RevertToCentralContext::class,
PermissionEnded::class,
],
Events\BootstrappingTenancy::class => [],
Events\TenancyBootstrapped::class => [
PermissionBootstraper::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(): void
{
//
}
public function boot(): void
{
if ($this->app->environment('production')) {
DomainTenantResolver::$shouldCache = true;
}
$this->bootEvents();
$this->mapRoutes();
$this->makeTenancyMiddlewareHighestPriority();
}
protected function bootEvents()
{
foreach ($this->events() as $event => $listeners) {
foreach (array_unique($listeners) as $listener) {
if (is_object($listener) && $listener instanceof JobPipeline) {
$listener = $listener->toListener();
}
Event::listen($event, $listener);
}
}
}
protected function mapRoutes()
{
if (file_exists(base_path('routes/tenant.php'))) {
Route::group([], base_path('routes/tenant.php'));
}
}
protected function makeTenancyMiddlewareHighestPriority()
{
$tenancyMiddleware = [
// Even higher priority than the initialization middleware
Middleware\PreventAccessFromCentralDomains::class,
Middleware\InitializeTenancyByDomain::class,
Middleware\InitializeTenancyBySubdomain::class,
Middleware\InitializeTenancyByDomainOrSubdomain::class,
InitializeTenancyByNovaDomain::class,
Middleware\InitializeTenancyByPath::class,
Middleware\InitializeTenancyByRequestData::class,
];
foreach (array_reverse($tenancyMiddleware) as $middleware) {
$this->app[Kernel::class]->prependToMiddlewarePriority($middleware);
}
}
}