diff --git a/src/DatabaseManager.php b/src/DatabaseManager.php index 05a8039b..e422674d 100644 --- a/src/DatabaseManager.php +++ b/src/DatabaseManager.php @@ -2,8 +2,14 @@ namespace Stancl\Tenancy; +use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\DB; +use Illuminate\Queue\SerializesModels; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Database\DatabaseManager as BaseDatabaseManager; +use Stancl\Tenancy\Interfaces\DatabaseCreator; class DatabaseManager { @@ -41,7 +47,11 @@ class DatabaseManager throw new \Exception("Database could not be created: no database creator for driver $driver is registered."); } - app($databaseCreators[$driver])->createDatabase($name); + if (config('tenancy.queue_database_creation', false)) { + QueuedDatabaseCreator::dispatch(app($databaseCreators[$driver], $name)); + } else { + app($databaseCreators[$driver])->createDatabase($name); + } } public function getDriver(): ?string @@ -62,3 +72,31 @@ class DatabaseManager config()->set(['database.connections.tenant.database' => $database_name]); } } + +class QueuedDatabaseCreator implements ShouldQueue +{ + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + + /** + * Create a new job instance. + * + * @param DatabaseCreator $databaseCreator + * @param string $databaseName + * @return void + */ + public function __construct(DatabaseCreator $databaseCreator, string $databaseName) + { + $this->databaseCreator = $databaseCreator; + $this->databaseName = $databaseName; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $this->databaseCreator->createDatabase($databaseName); + } +} diff --git a/src/config/tenancy.php b/src/config/tenancy.php index be5e00da..876c5b65 100644 --- a/src/config/tenancy.php +++ b/src/config/tenancy.php @@ -33,4 +33,5 @@ return [ 'sqlite' => 'Stancl\Tenancy\DatabaseCreators\SQLiteDatabaseCreator', 'mysql' => 'Stancl\Tenancy\DatabaseCreators\MySQLDatabaseCreator', ], + 'queue_database_creation' => false, ];