php Symfony 3将动态实体管理器传递到请求侦听器

php Symfony 3将动态实体管理器传递到请求侦听器,php,symfony,Php,Symfony,在我的Symfony 3.4项目中,我得到了几个由一个实体管理器管理的数据库。考虑下面的代码: config.yml doctrine: dbal: default_connection: default connections: dynamic: driver: pdo_mysql host: "%database_host%" port: "%data

在我的Symfony 3.4项目中,我得到了几个由一个实体管理器管理的数据库。考虑下面的代码:

config.yml

doctrine:
dbal:
    default_connection:       default
    connections:   
        dynamic:
            driver:   pdo_mysql
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name_dynamic%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  UTF8 
            wrapper_class: 'AppBundle\Connection\ConnectionWrapper'    
orm:
    default_entity_manager:   default
    auto_generate_proxy_classes: "%kernel.debug%"
    entity_managers:   
        dynamic:
            connection:       dynamic
            auto_mapping:     false
            mappings:
                DynamicBundle: ~
            naming_strategy:  doctrine.orm.naming_strategy.underscore  
app.handler.session_idle:
        class: AppBundle\EventListener\RequestListener
        arguments: ["@doctrine.orm.dynamic_entity_manager"]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
AppBundle\Connection\ConnectionWrapper

<?php

namespace AppBundle\Connection;

use Doctrine\DBAL\Connection;
use Symfony\Component\HttpFoundation\Session\Session;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Events;
use Doctrine\DBAL\Event\ConnectionEventArgs;
use Doctrine\DBAL\Driver;

class ConnectionWrapper extends Connection
{

/**
* @var array
*/
private $params = [];

/**
 * @var bool
 */
private $_isConnected = false;

public function __construct(array $params, Driver $driver, $config, $eventManager)
{
    $this->params['dbname'] = $params['dbname'];
    $this->params['user'] = $params['user'];
    $this->params['password'] = $params['password'];
    parent::__construct($params, $driver, $config, $eventManager);
}

public function forceSwitch($dbName, $dbUser, $dbPassword)
{
$this->params['dbname'] = $dbName;
$this->params['user'] = $dbUser;
$this->params['password'] = $dbPassword;

 if ($this->isConnected()) {
    $this->close();
  }
}

/**
 * {@inheritDoc}
 */
public function connect()
{

  if ($this->isConnected()) {
    return true;
  }

$driverOptions = isset($params['driverOptions']) ? $params['driverOptions'] : array();

$params = $this->getParams();
$params['dbname'] = $this->params['dbname'];

$this->_conn = $this->_driver->connect($params, $this->params['user'], $this->params['password'], $driverOptions);

if ($this->_eventManager->hasListeners(Events::postConnect)) {
    $eventArgs = new ConnectionEventArgs($this);
    $this->_eventManager->dispatchEvent(Events::postConnect, $eventArgs);
}

 $this->_isConnected = true;

 return true;
}

/**
 * {@inheritDoc}
 */
public function isConnected()
{
    return $this->_isConnected;
}

/**
 * {@inheritDoc}
 */
public function close()
  {
    if ($this->isConnected()) {
        parent::close();
        $this->_isConnected = false;
  }
 } 
}
AppBundle\EventListener\RequestListener

namespace AppBundle\EventListener;

use Doctrine\ORM\EntityManager;

class RequestListener{
    protected $entityManager;
    public function __construct(EntityManager $entityManager){
       EntityManager $entityManager
    }

    public function onKernelRequest(GetResponseEvent $event){
     $em = $this->entityManager;
    }
}
ConnectionWrapper
类的目的是在加载应用程序后根据登录的用户切换数据库(每个用户都有自己的数据库)

但是,当我尝试使用
动态实体管理器加载我的应用程序时,出现以下错误:

Uncaught PHP Exception Doctrine\DBAL\Exception\ConnectionException: "An exception occurred in driver: SQLSTATE[HY000] [1045] Access denied for user ''@'192.168.208.1' (using password: NO)" at /var/www/html/public/dev/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php line 93 
如果我使用
默认实体管理器
一切正常,甚至可以访问
动态实体管理器
。任何关于如何修复错误的想法都是受欢迎的。多谢各位

UPD_1

在这个问题上,据说它注入了一个
Doctrine\Common\Persistence\ManagerRegistry
,但我需要将它放入
services.yml
声明中。有什么办法吗?多谢各位