Используя Symfony 4 , мы создаем приложение для нескольких клиентов , где у каждого клиента есть отдельная база данных.Базы данных клиентов создаются автоматически по требованию при создании нового клиента.В ходе этого процесса мы создаем уникальный дополнительный файл .env (для клиента), в котором хранятся учетные данные подключения к базе данных.
У нас есть 2x подключения к базе данных и 2x менеджера сущностей - 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?