Я пытаюсь динамически переключать базу данных, используя следующий код. Но этого не происходит, он все еще подключен к базе данных, указанной в конфигурации.
В моем файле конфигурации базы данных у меня есть wrapper_class: Doctrine\DBAL\Connections\MasterSlaveConnection
У меня есть следующее определение службы в service.yml
database_switcher:
class: MyBundle\Service\DatabaseSwitcher
arguments: ['@request_stack', '@doctrine.dbal.default_connection', '@logger']
scope: request
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
И следующая реализация для переключения базы данных.
namespace MyBundle\Service;
use Doctrine\DBAL\Connection;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Bridge\Monolog\Logger;
use Exception;
class DatabaseSwitcher
{
private $request;
private $connection;
private $logger;
public function __construct(
RequestStack $requestStack,
Connection $connection,
Logger $logger
)
{
$this->request = $requestStack->getCurrentRequest();
$this->connection = $connection;
$this->logger = $logger;
}
public function onKernelRequest() {
if ($this->request->headers->has('Switch-DB')) {
$dbName = $this->request->headers->get('Switch-DB');
$connection = $this->connection;
$params = $this->connection->getParams();
if ($dbName != $params['master']['dbname']) {
$this
->logger
->debug('switching connection from '. $params['master']['dbname'] .' to '. $dbName);
$params['master']['dbname'] = $dbName;
if ($connection->isConnected()) {
$connection->close();
}
$connection->__construct(
$params,
$connection->getDriver(),
$connection->getConfiguration(),
$connection->getEventManager()
);
try {
$connection->connect();
} catch (Exception $e) {
}
}
}
}
}
И когда я вызываю API с пользовательским заголовком Switch-DB = 'test_DB'
, я все еще получаю данные из соединения по умолчанию, указанного в конфигурации.