From 95ee295da1527e280dea94d50054de90c754f7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Mon, 10 Feb 2020 16:04:40 +0100 Subject: [PATCH] Fix PDO serialization exception (#289) * Fix PDO serialization exception when queueing tenant creation * Apply fixes from StyleCI * Fix $this->database() calls --- src/Contracts/Future/CanSetConnection.php | 4 +-- src/DatabaseManager.php | 2 +- .../MySQLDatabaseManager.php | 29 +++++++++++-------- .../PostgreSQLDatabaseManager.php | 28 +++++++++++------- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/Contracts/Future/CanSetConnection.php b/src/Contracts/Future/CanSetConnection.php index 4fde6cb4..3c4d527b 100644 --- a/src/Contracts/Future/CanSetConnection.php +++ b/src/Contracts/Future/CanSetConnection.php @@ -4,12 +4,10 @@ declare(strict_types=1); 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); + public function setConnection(string $connection): void; } diff --git a/src/DatabaseManager.php b/src/DatabaseManager.php index 7d653d86..9890e588 100644 --- a/src/DatabaseManager.php +++ b/src/DatabaseManager.php @@ -238,7 +238,7 @@ class DatabaseManager $databaseManager = $this->app[$databaseManagers[$driver]]; if ($connectionName !== 'tenant' && $databaseManager instanceof CanSetConnection) { - $databaseManager->setConnection($this->database->connection($connectionName)); + $databaseManager->setConnection($connectionName); } return $databaseManager; diff --git a/src/TenantDatabaseManagers/MySQLDatabaseManager.php b/src/TenantDatabaseManagers/MySQLDatabaseManager.php index 9ed211bc..f6c4ef96 100644 --- a/src/TenantDatabaseManagers/MySQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/MySQLDatabaseManager.php @@ -6,40 +6,45 @@ namespace Stancl\Tenancy\TenantDatabaseManagers; use Illuminate\Contracts\Config\Repository; use Illuminate\Database\Connection; -use Illuminate\Database\DatabaseManager as IlluminateDatabaseManager; +use Illuminate\Support\Facades\DB; use Stancl\Tenancy\Contracts\Future\CanSetConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; class MySQLDatabaseManager implements TenantDatabaseManager, CanSetConnection { - /** @var Connection */ - protected $database; + /** @var string */ + protected $connection; - public function __construct(Repository $config, IlluminateDatabaseManager $databaseManager) + public function __construct(Repository $config) { - $this->database = $databaseManager->connection($config['tenancy.database_manager_connections.mysql']); + $this->connection = $config->get('tenancy.database_manager_connections.mysql'); } - public function setConnection(Connection $connection) + protected function database(): Connection { - $this->database = $connection; + return DB::connection($this->connection); + } + + public function setConnection(string $connection): void + { + $this->connection = $connection; } public function createDatabase(string $name): bool { - $charset = $this->database->getConfig('charset'); - $collation = $this->database->getConfig('collation'); + $charset = $this->database()->getConfig('charset'); + $collation = $this->database()->getConfig('collation'); - return $this->database->statement("CREATE DATABASE `$name` CHARACTER SET `$charset` COLLATE `$collation`"); + return $this->database()->statement("CREATE DATABASE `$name` CHARACTER SET `$charset` COLLATE `$collation`"); } public function deleteDatabase(string $name): bool { - return $this->database->statement("DROP DATABASE `$name`"); + return $this->database()->statement("DROP DATABASE `$name`"); } public function databaseExists(string $name): bool { - return (bool) $this->database->select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$name'"); + return (bool) $this->database()->select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$name'"); } } diff --git a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php index 688b357e..fc21668e 100644 --- a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php @@ -6,36 +6,42 @@ namespace Stancl\Tenancy\TenantDatabaseManagers; use Illuminate\Contracts\Config\Repository; use Illuminate\Database\Connection; -use Illuminate\Database\DatabaseManager as IlluminateDatabaseManager; +use Illuminate\Support\Facades\DB; +use Stancl\Tenancy\Contracts\Future\CanSetConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; -class PostgreSQLDatabaseManager implements TenantDatabaseManager +class PostgreSQLDatabaseManager implements TenantDatabaseManager, CanSetConnection { - /** @var Connection */ - protected $database; + /** @var string */ + protected $connection; - public function __construct(Repository $config, IlluminateDatabaseManager $databaseManager) + public function __construct(Repository $config) { - $this->database = $databaseManager->connection($config['tenancy.database_manager_connections.pgsql']); + $this->connection = $config->get('tenancy.database_manager_connections.pgsql'); } - public function setConnection(Connection $connection) + protected function database(): Connection { - $this->database = $connection; + return DB::connection($this->connection); + } + + public function setConnection(string $connection): void + { + $this->connection = $connection; } public function createDatabase(string $name): bool { - return $this->database->statement("CREATE DATABASE \"$name\" WITH TEMPLATE=template0"); + return $this->database()->statement("CREATE DATABASE \"$name\" WITH TEMPLATE=template0"); } public function deleteDatabase(string $name): bool { - return $this->database->statement("DROP DATABASE \"$name\""); + return $this->database()->statement("DROP DATABASE \"$name\""); } public function databaseExists(string $name): bool { - return (bool) $this->database->select("SELECT datname FROM pg_database WHERE datname = '$name'"); + return (bool) $this->database()->select("SELECT datname FROM pg_database WHERE datname = '$name'"); } }