From cb2a061ed2d2cc93658f9cf5500aec97a75b3b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= <samuel.stancl@gmail.com> Date: Wed, 11 Dec 2019 19:06:51 +0100 Subject: [PATCH 1/2] Add TenantDatabaseManager::setConnection() --- src/Contracts/Future/CanSetConnection.php | 13 +++++++++++++ src/DatabaseManager.php | 11 +++++++++-- src/TenantDatabaseManagers/MySQLDatabaseManager.php | 11 +++++++++-- .../PostgreSQLDatabaseManager.php | 8 +++++++- 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 src/Contracts/Future/CanSetConnection.php diff --git a/src/Contracts/Future/CanSetConnection.php b/src/Contracts/Future/CanSetConnection.php new file mode 100644 index 000000000..46eed8538 --- /dev/null +++ b/src/Contracts/Future/CanSetConnection.php @@ -0,0 +1,13 @@ +<?php + +namespace Stancl\Tenancy\Contracts\Future; + +use Illuminate\Database\Connection; + +/** + * This interface *might* be part of the TenantDatabaseManager interface in 3.x. + */ +interface CanSetConnection +{ + public function setConnection(Connection $connection); +} \ No newline at end of file diff --git a/src/DatabaseManager.php b/src/DatabaseManager.php index 151a9455a..7d653d867 100644 --- a/src/DatabaseManager.php +++ b/src/DatabaseManager.php @@ -8,6 +8,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Database\DatabaseManager as BaseDatabaseManager; use Illuminate\Foundation\Application; +use Stancl\Tenancy\Contracts\Future\CanSetConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; use Stancl\Tenancy\Exceptions\DatabaseManagerNotRegisteredException; use Stancl\Tenancy\Exceptions\TenantDatabaseAlreadyExistsException; @@ -226,7 +227,7 @@ public function deleteDatabase(Tenant $tenant) */ public function getTenantDatabaseManager(Tenant $tenant): TenantDatabaseManager { - $driver = $this->getDriver($this->getBaseConnection($tenant->getConnectionName())); + $driver = $this->getDriver($this->getBaseConnection($connectionName = $tenant->getConnectionName())); $databaseManagers = $this->app['config']['tenancy.database_managers']; @@ -234,6 +235,12 @@ public function getTenantDatabaseManager(Tenant $tenant): TenantDatabaseManager throw new DatabaseManagerNotRegisteredException($driver); } - return $this->app[$databaseManagers[$driver]]; + $databaseManager = $this->app[$databaseManagers[$driver]]; + + if ($connectionName !== 'tenant' && $databaseManager instanceof CanSetConnection) { + $databaseManager->setConnection($this->database->connection($connectionName)); + } + + return $databaseManager; } } diff --git a/src/TenantDatabaseManagers/MySQLDatabaseManager.php b/src/TenantDatabaseManagers/MySQLDatabaseManager.php index 548f628df..9ed211bca 100644 --- a/src/TenantDatabaseManagers/MySQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/MySQLDatabaseManager.php @@ -5,12 +5,14 @@ namespace Stancl\Tenancy\TenantDatabaseManagers; use Illuminate\Contracts\Config\Repository; +use Illuminate\Database\Connection; use Illuminate\Database\DatabaseManager as IlluminateDatabaseManager; +use Stancl\Tenancy\Contracts\Future\CanSetConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; -class MySQLDatabaseManager implements TenantDatabaseManager +class MySQLDatabaseManager implements TenantDatabaseManager, CanSetConnection { - /** @var \Illuminate\Database\Connection */ + /** @var Connection */ protected $database; public function __construct(Repository $config, IlluminateDatabaseManager $databaseManager) @@ -18,6 +20,11 @@ public function __construct(Repository $config, IlluminateDatabaseManager $datab $this->database = $databaseManager->connection($config['tenancy.database_manager_connections.mysql']); } + public function setConnection(Connection $connection) + { + $this->database = $connection; + } + public function createDatabase(string $name): bool { $charset = $this->database->getConfig('charset'); diff --git a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php index 9fe672973..688b357e2 100644 --- a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php @@ -5,12 +5,13 @@ namespace Stancl\Tenancy\TenantDatabaseManagers; use Illuminate\Contracts\Config\Repository; +use Illuminate\Database\Connection; use Illuminate\Database\DatabaseManager as IlluminateDatabaseManager; use Stancl\Tenancy\Contracts\TenantDatabaseManager; class PostgreSQLDatabaseManager implements TenantDatabaseManager { - /** @var \Illuminate\Database\Connection */ + /** @var Connection */ protected $database; public function __construct(Repository $config, IlluminateDatabaseManager $databaseManager) @@ -18,6 +19,11 @@ public function __construct(Repository $config, IlluminateDatabaseManager $datab $this->database = $databaseManager->connection($config['tenancy.database_manager_connections.pgsql']); } + public function setConnection(Connection $connection) + { + $this->database = $connection; + } + public function createDatabase(string $name): bool { return $this->database->statement("CREATE DATABASE \"$name\" WITH TEMPLATE=template0"); From f58591a4fde819480b5586e92e17d50cff450414 Mon Sep 17 00:00:00 2001 From: stancl <samuel.stancl@gmail.com> Date: Wed, 11 Dec 2019 18:07:31 +0000 Subject: [PATCH 2/2] Apply fixes from StyleCI --- src/Contracts/Future/CanSetConnection.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Contracts/Future/CanSetConnection.php b/src/Contracts/Future/CanSetConnection.php index 46eed8538..4fde6cb4d 100644 --- a/src/Contracts/Future/CanSetConnection.php +++ b/src/Contracts/Future/CanSetConnection.php @@ -1,5 +1,7 @@ <?php +declare(strict_types=1); + namespace Stancl\Tenancy\Contracts\Future; use Illuminate\Database\Connection; @@ -10,4 +12,4 @@ interface CanSetConnection { public function setConnection(Connection $connection); -} \ No newline at end of file +}