Use DBAL Driver middleware to handle the correct connection timezone

I looked into using DBAL events for this but found that DBAL events
are deprecated so I went with middleware as they are recommended
as a replacement for the DBAL events.
[MAILPOET-6142]
This commit is contained in:
Rostislav Wolny
2024-08-13 10:36:13 +02:00
committed by Aschepikov
parent 3ea44e45d4
commit 9f32c59e49
4 changed files with 34 additions and 8 deletions

View File

@@ -2,12 +2,16 @@
namespace MailPoet\Doctrine;
use MailPoet\Doctrine\Middlewares\PostConnectMiddleware;
use MailPoet\Doctrine\Types\BigIntType;
use MailPoet\Doctrine\Types\DateTimeTzToStringType;
use MailPoet\Doctrine\Types\JsonOrSerializedType;
use MailPoet\Doctrine\Types\JsonType;
use MailPoet\Doctrine\Types\SerializedArrayType;
use MailPoet\Doctrine\WPDB\Driver as WPDBDriver;
use MailPoetVendor\Doctrine\DBAL\Configuration;
use MailPoetVendor\Doctrine\DBAL\Driver;
use MailPoetVendor\Doctrine\DBAL\Driver\Middleware;
use MailPoetVendor\Doctrine\DBAL\DriverManager;
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
use MailPoetVendor\Doctrine\DBAL\Types\Type;
@@ -32,7 +36,7 @@ class ConnectionFactory {
];
$this->setupTypes();
return DriverManager::getConnection($connectionParams);
return DriverManager::getConnection($connectionParams, $this->getConfiguration());
}
private function setupTypes() {
@@ -44,4 +48,15 @@ class ConnectionFactory {
}
}
}
private function getConfiguration(): Configuration {
$config = new Configuration();
$driverMiddleware = new class implements Middleware {
public function wrap(Driver $driver): Driver {
return new PostConnectMiddleware($driver);
}
};
$config->setMiddlewares([$driverMiddleware]);
return $config;
}
}

View File

@@ -0,0 +1,14 @@
<?php declare(strict_types = 1);
namespace MailPoet\Doctrine\Middlewares;
use MailPoetVendor\Doctrine\DBAL\Driver\Connection;
use MailPoetVendor\Doctrine\DBAL\Driver\Middleware\AbstractDriverMiddleware;
class PostConnectMiddleware extends AbstractDriverMiddleware {
public function connect(array $params): Connection {
$connection = parent::connect($params);
$connection->exec('SET time_zone = "+00:00"');
return $connection;
}
}

View File

@@ -18,11 +18,6 @@ class Connection implements ServerInfoAwareConnection {
if (!$wpdb instanceof wpdb) {
throw new ConnectionException('WPDB is not initialized.');
}
/**
* Ensure connection is in UTC timezone.
* We use timestamp columns and we expect to get UTC time
*/
$wpdb->query("SET time_zone = '+00:00'");
}
public function prepare(string $sql): Statement {

View File

@@ -3,10 +3,11 @@
namespace MailPoet\Test\Config;
use MailPoet\Doctrine\ConnectionFactory;
use MailPoet\Doctrine\Middlewares\PostConnectMiddleware;
use MailPoet\Doctrine\Types\JsonOrSerializedType;
use MailPoet\Doctrine\Types\JsonType;
use MailPoet\Doctrine\WPDB\Driver as WPDBDriver;
use MailPoetVendor\Doctrine\DBAL\Connection;
use MailPoetVendor\Doctrine\DBAL\Driver;
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
use MailPoetVendor\Doctrine\DBAL\Types\Type;
@@ -16,7 +17,8 @@ class ConnectionFactoryTest extends \MailPoetTest {
$connection = $connectionFactory->createConnection();
verify($connection)->instanceOf(Connection::class);
verify($connection->getDriver())->instanceOf(WPDBDriver::class);
verify($connection->getDriver())->instanceOf(Driver::class);
verify($connection->getDriver())->instanceOf(PostConnectMiddleware::class);
verify($connection->getDatabasePlatform())->instanceOf(MySQLPlatform::class);
verify(Type::getType(JsonType::NAME))->instanceOf(JsonType::class);