0

我有两个 dbal 连接。一种是静态的,在 config.yml 中定义,一种是动态定义。当我在控制器中需要它时,我会设置连接参数,例如主机、数据库名称、密码等......

我需要在执行登录检查操作(或在此操作中)之前设置动态连接。这是因为我的“用户”实体根据 URL 在不同的数据库中。所以我不能把动态连接定义放在 config.yml 文件中。

我使用该方法来设置我需要的实体管理器:

public function switchConnection($connectionParam=array()) 
{ 
    $conn = array_merge(
            array('host'=>'127.0.0.1', 'port'=>'3306', 'dbName'=>'myDatabaseName', 'user'=>'myUser', 'pass'=>'myPass',  'driver'=>'pdo_mysql', 'connection'=>'default', 'em'=>'default')
        , $connectionParam);

    $dbalConnectionTo=sprintf('doctrine.dbal.%s_connection', $conn['connection']); 
    $connection = $this->container->get($dbalConnectionTo); 
    $connection->close(); 
    $refConn = new \ReflectionObject($connection); 
    $refParams = $refConn->getProperty('_params'); 
    $refParams->setAccessible('public');

    $params = $refParams->getValue($connection); 
    $params['dbname'] = $conn['dbName']; 
    $params['user'] = $conn['user']; 
    $params['host'] = $conn['host']; 
    $params['port'] = $conn['port'];
    $params['password'] = $conn['pass']; 
    $params['driver'] = $conn['driver']; 
    $params['charset']='UTF8';

    $refParams->setAccessible('private');
    $refParams->setValue($connection,$params); 
    $this->container->get('doctrine')->resetEntityManager($conn['em']); 
    return; 
}

我可以更改“login_check”操作代码以按我的方式设置实体管理器吗?

4

1 回答 1

2

通常,在特定条件下更改默认数据库连接是不好的做法。此外,用户需要加载任何(登录)请求,而不仅仅是登录请求。

但是当然有一种 symfony 方法可以实现从不同的数据库加载用户。

您将需要实现自己的 UserProvider 以从不同的数据库连接加载用户。是用户提供者的示例。

于 2012-11-05T10:02:36.653 回答