Невозможно динамически переключать базу данных в Symfony 3.4.35

Я пытаюсь динамически переключать базу данных, используя следующий код. Но этого не происходит, он все еще подключен к базе данных, указанной в конфигурации.

В моем файле конфигурации базы данных у меня есть 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', я все еще получаю данные из соединения по умолчанию, указанного в конфигурации.


person Unnikrishnan    schedule 28.07.2020    source источник
comment
@Leprechaun - Да, спасибо!   -  person Unnikrishnan    schedule 29.07.2020