2015-10-31 3 views
4

Я работаю в многопользовательском программном обеспечении (SaaS), построенном с помощью на расширенном шаблоне, но у меня нет желаемого результата по подключению базы данных арендаторов.Multi-tenant SaaS, построенный в Yii2

Я пытаюсь установить соединение с базой данных, как следующий в моем файле конфигурации для интерфейса:

$defaultAdminDB = [ 
    'class' => 'yii\db\Connection', 
    'dsn' => 'pgsql:host=localhost;dbname=untitled', 
    'username' => 'postgres', 
    'password' => 'myPass', 
    'charset' => 'utf8', 
]; 

$config = [ 
    'components' => [ 
    'db' => function(){ 
     if (Yii::$app->session->get('login', false)){ 
     return [ 
      'class' => 'yii\db\Connection', 
      'dsn' => Yii::$app->session->get('client_connection.dns'), 
      'username' => Yii::$app->session->get('client_connection.username'), 
      'password' => Yii::$app->session->get('client_connection.password'), 
      'charset' => 'utf8', 
     ]; 
     } 

     return [ 
     'class' => 'yii\db\Connection', 
     'dsn' => 'pgsql:host=localhost;dbname=untitled', 
     'username' => 'postgres', 
     'password' => 'myPass', 
     'charset' => 'utf8', 
     ]; 
    }, 
    'dbAdmin' => $defaultAdminDB 
    ] 
]; 

Тогда у меня есть два шага войти, где первый просит для входа в систему (арендатора ид) и в следующем - пользователь и пароль. На первом контроллере я следующий с:

$account = \frontend\models\AdminAccounts::findOne(['login'=>$this->login]); 

if (!$account){ 
    $this->addError('login', Yii::t('app', 'Account data not found.')); 
    return false; 
} 

$dns = sprintf('pgsql:host=%s;dbname=%s', $account->getAttribute('db_host'), $account->getAttribute('db')); 

Yii::$app->session->set('login', $this->login); 
Yii::$app->session->set('client_connection.dns', $dns); 
Yii::$app->session->set('client_connection.username', $account->getAttribute('db_user')); 
Yii::$app->session->set('client_connection.password', $account->getAttribute('db_pass')); 

я успешно данные учетной записи (арендатор) и хранить его в сессии, но я думаю, что моя ошибка на инстанцирования yii\db\Connection по getDb() методы модели.

Надежда может мне помочь. С уважением!

ответ

0

Вы можете попробовать

Yii::$app->db = new \yii\db\Connection([ 
'dsn' => Yii::$app->session->get('client_connection.dsn'), 
'username' => Yii::$app->session->get('client_connection.username'), 
'password' => Yii::$app->session->get('client_connection.password'), 
]); 
+0

Вы можете объяснить, что вы сделали и почему оно отвечает на вопрос – depperm

0

Если вы изменяете информацию о соединении дб существующего подключения к БД, то вы должны закрыть существующее соединение (Yii :: $ app-> db-> близко()), измените информацию о подключении, а затем откройте новое соединение (Yii :: $ app-> db-> open()).

Смежные вопросы