使用 Symfony 4 ,我们正在构建一个多客户应用程序,其中每个客户都有一个专用的数据库。创建新客户时,将自动按需创建客户数据库。在此过程中,我们将创建唯一的额外.env文件(特定于客户),该文件包含数据库连接凭据。
我们有2个数据库连接和2个实体管理器-common
和customer
。 customer
实体管理器实际上是默认的。显然,customer
实体管理器起初没有正确的连接参数。
我们根据内核请求相应地(例如基于域)加载额外的.env文件,并相应地设置customer
连接和实体管理器:
$connection = $this->entityManager->getConnection();
$connection->close();
$reflectionConn = new \ReflectionObject($connection);
$reflectionParams = $reflectionConn->getProperty('params');
$reflectionParams->setAccessible(true);
$params = $reflectionParams->getValue($connection);
$params['dbname'] = $database; // read from the customer specific .env
$params['user'] = $username; // read from the customer specific .env
$params['password'] = $password; // read from the customer specific .env
$reflectionParams->setValue($connection, $params);
$reflectionParams->setAccessible(false);
$this->entityManager = $this->entityManager->create(
$this->entityManager->getConnection(),
$this->entityManager->getConfiguration()
);
这很好!
问题是安全上下文(?)-我们正在使用FosUserBundle,它无法授权用户。我猜上面的代码不足以影响安全上下文。
使用标准FosUserBundle实现动态数据库连接+用户授权的目标的正确方法是什么?
答案 0 :(得分:0)
该问题根本与安全上下文无关。问题(很傻)是我的内核请求侦听器具有默认优先级(0),这使登录侦听器发生后整个客户配置加载和连接设置得以实现。
将其设置为512(应该足够)以在SessionListener之前启动