Как в symfony 3 динамически поменять базу данных?

Здравствуйте.
Ситуация следуюящая: есть неограниченное число однотипных (одинаковых по структуре но разных по содержанию) баз данных, какую именно базу нужно использовать в тот или иной момент определяется во время выполнения скрипта. Соответственно к ней подключиться и использовать по умолчанию.
Как это сделать?
  • Вопрос задан
  • 345 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Не знаю всей задачи, но может подойдет вариант разруливания через окружение.
В app.php получаем нужную базу данных и подключаем соответствующее окружение, в конфиге которого подключаются доступы к БД
// $env = ...;
$kernel = new AppKernel($env, false);
$kernel->loadClassCache();


Upd:
На основании вашего комментария выше

Один и тот же скрипт использует несколько клиентов, какая именно база данных используется - определяется через субдомен. Список субдоменов и их баз данных хранится в служебной базе данных.

думаю подойдет такой вариант:

В app.php делайте запрос к основной БД через обычный \PDO. Вытащив от туда параметры подключения, добавляйте их в окружение через putenv, а в конфиге используйте эти переменные
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
SorokinWS
@SorokinWS Автор вопроса
Итак, напишу пока то, что удалось сделать.
1. В конфигурационном файле указываем базу данных, которую мы будем использовать при разработке ну и она же будет содержать итоговую структуру.

2. После того как становится известна нужная нам база данных, производим подключение следующем образом:
<?
//получаем и закрываем соединение
$connection = $this->get('doctrine.dbal.default_connection');
$connection->close();

//Дальше варварство
$ReflectionObject = new \ReflectionObject($connection);
$Params = $refConn->getProperty('_params');
$Params->setAccessible(true);

$p = $refParams->getValue($connection);
$p['dbname'] = ;
$p['user'] = ;
$p['password'] = ;
		
$Params->setValue($connection, $p);
$Params->setAccessible(false);
?>
Ответ написан
@dimarick
Сделайте под каждую базу свой ентити-менеджер, а в KernelRequest выбирайте из них и сохраняйте в default_entity_manager и default_connection. Если только таких баз не очень много
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы