From 7e2eed88da22c62014c8b34ef23d5b37add8b2a1 Mon Sep 17 00:00:00 2001 From: Chris Brown Date: Thu, 17 Oct 2019 10:57:58 -0400 Subject: [PATCH] [2.1.0] Allow automatic seeding after automatic migrations Fixes #158 If config('tenancy.seeder_class') is null or a blank string, the seeder-class parameter is not passed, and therefore Laravel's default option of calling 'DatabaseSeeder' will occur. As with Laravel's normal seeding process, the class is treated as the "root" seeder class, which can call other seeder classes in turn. --- assets/config.php | 2 ++ src/Jobs/QueuedTenantDatabaseSeeder.php | 42 +++++++++++++++++++++++++ src/TenantManager.php | 25 +++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 src/Jobs/QueuedTenantDatabaseSeeder.php diff --git a/assets/config.php b/assets/config.php index a6b84e68..e3af7291 100644 --- a/assets/config.php +++ b/assets/config.php @@ -91,6 +91,8 @@ return [ 'home_url' => '/app', 'queue_database_creation' => false, 'migrate_after_creation' => false, // run migrations after creating a tenant + 'seed_after_migration' => false, // should the seeder run after automatic migration + 'seeder_class' => 'DatabaseSeeder', // root seeder class to run after automatic migrations, eg: 'DatabaseSeeder' 'queue_database_deletion' => false, 'delete_database_after_tenant_deletion' => false, // delete the tenant's database after deleting the tenant 'unique_id_generator' => Stancl\Tenancy\UniqueIDGenerators\UUIDGenerator::class, diff --git a/src/Jobs/QueuedTenantDatabaseSeeder.php b/src/Jobs/QueuedTenantDatabaseSeeder.php new file mode 100644 index 00000000..609c9b71 --- /dev/null +++ b/src/Jobs/QueuedTenantDatabaseSeeder.php @@ -0,0 +1,42 @@ +tenantId = $tenant->id; + $this->seederClassParameter = ! empty($seederClassName) ? ['--class' => $seederClassName] : []; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + Artisan::call('tenants:seed', [ + '--tenants' => [$this->tenantId], + ] + $this->seederClassParameter); + } +} diff --git a/src/TenantManager.php b/src/TenantManager.php index 16030245..3b31e92a 100644 --- a/src/TenantManager.php +++ b/src/TenantManager.php @@ -76,6 +76,21 @@ class TenantManager ]); }, ]; + + if ($this->shouldSeedAfterMigration()) { + $seederClassName = $this->getSeederRootClass(); + $seederClassParameter = ! empty($seederClassName) ? ['--class' => $seederClassName] : []; + + $afterCreating += $this->databaseCreationQueued() ? [ + new QueuedTenantDatabaseSeeder($tenant, $seederClassName), + ] : [ + function () use ($tenant, $seederClassParameter) { + $this->artisan->call('tenants:seed', [ + '--tenants' => [$tenant['id']], + ] + $seederClassParameter); + }, + ]; + } } $this->database->createDatabase($tenant, $afterCreating); @@ -321,6 +336,11 @@ class TenantManager return $this->app['config']['tenancy.migrate_after_creation'] ?? false; } + public function shouldSeedAfterMigration(): bool + { + return $this->shouldMigrateAfterCreation() && $this->app['config']['tenancy.seed_after_migration'] ?? false; + } + public function databaseCreationQueued(): bool { return $this->app['config']['tenancy.queue_database_creation'] ?? false; @@ -331,6 +351,11 @@ class TenantManager return $this->app['config']['tenancy.delete_database_after_tenant_deletion'] ?? false; } + public function getSeederRootClass() + { + return $this->app['config']['tenancy.seeder_class'] ?? null; + } + /** * Add an event listener. *