1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-05 10:14:04 +00:00

[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.
This commit is contained in:
Chris Brown 2019-10-17 10:57:58 -04:00
parent 58fbdd5281
commit 7e2eed88da
3 changed files with 69 additions and 0 deletions

View file

@ -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,

View file

@ -0,0 +1,42 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Artisan;
use Stancl\Tenancy\Tenant;
class QueuedTenantDatabaseSeeder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/** @var string */
protected $tenantId;
/** @var array */
protected $seederClassParameter = [];
public function __construct(Tenant $tenant, $seederClassName = '')
{
$this->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);
}
}

View file

@ -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.
*