Na het debuggen van de driver van Doctrine heb ik een niet-zo-elegante oplossing gemaakt, maar desalniettemin werkt het en kan het worden verbeterd.
Ik hou er niet van om toegang te krijgen tot de omgevingsvariabele in het stuurprogramma zelf, maar mogelijk kan dit worden verbeterd.
doctrine.yaml
doctrine:
dbal:
#driver: %database_driver%
driver_class: App\Infrastructure\Common\Service\PostgreSQLDoctrineDriver
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
#charset: UTF8
orm:
auto_generate_proxy_classes: %kernel.debug%
auto_mapping: true
PostgreSQLDoctrineDriver.php
<?php declare(strict_types=1);
namespace App\Infrastructure\Common\Service;
use Doctrine\DBAL\DBALException;
use Doctrine\DBAL\Driver\PDOConnection;
use Doctrine\DBAL\Driver\PDOPgSql\Driver;
use \PDO;
use \PDOException;
use function defined;
/**
* Driver that connects through pdo_pgsql
*
* Forked original PostgreSQL driver, extended to have a possibility to pass raw PDO DSN to be
* able to connect via Unix socket
*/
class PostgreSQLDoctrineDriver extends Driver
{
/**
* {@inheritdoc}
*/
public function connect(array $params, $username = null, $password = null, array $driverOptions = [])
{
try {
$pdo = new PDOConnection(
$_SERVER['POSTGRES_DB_PDO_DSN'] ?? '',
$username,
$password,
$driverOptions
);
if (defined('PDO::PGSQL_ATTR_DISABLE_PREPARES')
&& (! isset($driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES])
|| $driverOptions[PDO::PGSQL_ATTR_DISABLE_PREPARES] === true
)
) {
$pdo->setAttribute(PDO::PGSQL_ATTR_DISABLE_PREPARES, true);
}
/* defining client_encoding via SET NAMES to avoid inconsistent DSN support
* - the 'client_encoding' connection param only works with postgres >= 9.1
* - passing client_encoding via the 'options' param breaks pgbouncer support
*/
if (isset($params['charset'])) {
$pdo->exec('SET NAMES \'' . $params['charset'] . '\'');
}
return $pdo;
} catch (PDOException $e) {
throw DBALException::driverException($this, $e);
}
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'pdo_pgsql';
}
}