diff --git a/ConnectionFactory.php b/ConnectionFactory.php index 84e70aa8b..97b7d7a67 100644 --- a/ConnectionFactory.php +++ b/ConnectionFactory.php @@ -11,6 +11,7 @@ use Doctrine\DBAL\Exception\DriverException; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Types\Type; +use function is_subclass_of; class ConnectionFactory { @@ -42,12 +43,20 @@ public function createConnection(array $params, Configuration $config = null, Ev $this->initializeTypes(); } - $connection = DriverManager::getConnection($params, $config, $eventManager); - if (! isset($params['pdo']) && ! isset($params['charset'])) { - $params = $connection->getParams(); - $params['charset'] = 'utf8'; - $driver = $connection->getDriver(); + $wrapperClass = null; + if (isset($params['wrapperClass'])) { + if (! is_subclass_of($params['wrapperClass'], Connection::class)) { + throw DBALException::invalidWrapperClass($params['wrapperClass']); + } + + $wrapperClass = $params['wrapperClass']; + $params['wrapperClass'] = null; + } + + $connection = DriverManager::getConnection($params, $config, $eventManager); + $params = $connection->getParams(); + $driver = $connection->getDriver(); if ($driver instanceof AbstractMySQLDriver) { $params['charset'] = 'utf8mb4'; @@ -55,9 +64,19 @@ public function createConnection(array $params, Configuration $config = null, Ev if (! isset($params['defaultTableOptions']['collate'])) { $params['defaultTableOptions']['collate'] = 'utf8mb4_unicode_ci'; } + } else { + $params['charset'] = 'utf8'; + } + + if (null !== $wrapperClass) { + $params['wrapperClass'] = $wrapperClass; + } else { + $wrapperClass = Connection::class; } - $connection = new $connection($params, $driver, $connection->getConfiguration(), $connection->getEventManager()); + $connection = new $wrapperClass($params, $driver, $config, $eventManager); + } else { + $connection = DriverManager::getConnection($params, $config, $eventManager); } if (! empty($mappingTypes)) { diff --git a/Tests/ConnectionFactoryTest.php b/Tests/ConnectionFactoryTest.php index bfd34b823..e70cb5ba1 100644 --- a/Tests/ConnectionFactoryTest.php +++ b/Tests/ConnectionFactoryTest.php @@ -53,11 +53,17 @@ public function testContainer() public function testDefaultCharset() { $factory = new ConnectionFactory([]); - $params = ['driverClass' => FakeDriver::class]; + $params = [ + 'driverClass' => FakeDriver::class, + 'wrapperClass' => FakeConnection::class, + ]; + $creationCount = FakeConnection::$creationCount; $connection = $factory->createConnection($params); + $this->assertInstanceof(FakeConnection::class, $connection); $this->assertSame('utf8', $connection->getParams()['charset']); + $this->assertSame(1 + $creationCount, FakeConnection::$creationCount); } public function testDefaultCharsetMySql() @@ -132,3 +138,15 @@ public function getDatabase(Connection $conn) return 'fake_db'; } } + +class FakeConnection extends Connection +{ + public static $creationCount = 0; + + public function __construct(array $params, FakeDriver $driver, ?Configuration $config = null, ?EventManager $eventManager = null) + { + ++self::$creationCount; + + parent::__construct($params, $driver, $config, $eventManager); + } +}