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:
committed by
Aschepikov
parent
3ea44e45d4
commit
9f32c59e49
@@ -2,12 +2,16 @@
|
|||||||
|
|
||||||
namespace MailPoet\Doctrine;
|
namespace MailPoet\Doctrine;
|
||||||
|
|
||||||
|
use MailPoet\Doctrine\Middlewares\PostConnectMiddleware;
|
||||||
use MailPoet\Doctrine\Types\BigIntType;
|
use MailPoet\Doctrine\Types\BigIntType;
|
||||||
use MailPoet\Doctrine\Types\DateTimeTzToStringType;
|
use MailPoet\Doctrine\Types\DateTimeTzToStringType;
|
||||||
use MailPoet\Doctrine\Types\JsonOrSerializedType;
|
use MailPoet\Doctrine\Types\JsonOrSerializedType;
|
||||||
use MailPoet\Doctrine\Types\JsonType;
|
use MailPoet\Doctrine\Types\JsonType;
|
||||||
use MailPoet\Doctrine\Types\SerializedArrayType;
|
use MailPoet\Doctrine\Types\SerializedArrayType;
|
||||||
use MailPoet\Doctrine\WPDB\Driver as WPDBDriver;
|
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\DriverManager;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
|
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Types\Type;
|
use MailPoetVendor\Doctrine\DBAL\Types\Type;
|
||||||
@@ -32,7 +36,7 @@ class ConnectionFactory {
|
|||||||
];
|
];
|
||||||
|
|
||||||
$this->setupTypes();
|
$this->setupTypes();
|
||||||
return DriverManager::getConnection($connectionParams);
|
return DriverManager::getConnection($connectionParams, $this->getConfiguration());
|
||||||
}
|
}
|
||||||
|
|
||||||
private function setupTypes() {
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
14
mailpoet/lib/Doctrine/Middlewares/PostConnectMiddleware.php
Normal file
14
mailpoet/lib/Doctrine/Middlewares/PostConnectMiddleware.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@@ -18,11 +18,6 @@ class Connection implements ServerInfoAwareConnection {
|
|||||||
if (!$wpdb instanceof wpdb) {
|
if (!$wpdb instanceof wpdb) {
|
||||||
throw new ConnectionException('WPDB is not initialized.');
|
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 {
|
public function prepare(string $sql): Statement {
|
||||||
|
@@ -3,10 +3,11 @@
|
|||||||
namespace MailPoet\Test\Config;
|
namespace MailPoet\Test\Config;
|
||||||
|
|
||||||
use MailPoet\Doctrine\ConnectionFactory;
|
use MailPoet\Doctrine\ConnectionFactory;
|
||||||
|
use MailPoet\Doctrine\Middlewares\PostConnectMiddleware;
|
||||||
use MailPoet\Doctrine\Types\JsonOrSerializedType;
|
use MailPoet\Doctrine\Types\JsonOrSerializedType;
|
||||||
use MailPoet\Doctrine\Types\JsonType;
|
use MailPoet\Doctrine\Types\JsonType;
|
||||||
use MailPoet\Doctrine\WPDB\Driver as WPDBDriver;
|
|
||||||
use MailPoetVendor\Doctrine\DBAL\Connection;
|
use MailPoetVendor\Doctrine\DBAL\Connection;
|
||||||
|
use MailPoetVendor\Doctrine\DBAL\Driver;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
|
use MailPoetVendor\Doctrine\DBAL\Platforms\MySQLPlatform;
|
||||||
use MailPoetVendor\Doctrine\DBAL\Types\Type;
|
use MailPoetVendor\Doctrine\DBAL\Types\Type;
|
||||||
|
|
||||||
@@ -16,7 +17,8 @@ class ConnectionFactoryTest extends \MailPoetTest {
|
|||||||
$connection = $connectionFactory->createConnection();
|
$connection = $connectionFactory->createConnection();
|
||||||
|
|
||||||
verify($connection)->instanceOf(Connection::class);
|
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($connection->getDatabasePlatform())->instanceOf(MySQLPlatform::class);
|
||||||
|
|
||||||
verify(Type::getType(JsonType::NAME))->instanceOf(JsonType::class);
|
verify(Type::getType(JsonType::NAME))->instanceOf(JsonType::class);
|
||||||
|
Reference in New Issue
Block a user