2016-09-05 50 views
-1

我有一個適用於特定數據庫結構的Yii應用程序。我的公司有幾乎每一個emplyee這樣的數據庫。所以,我希望用戶能夠在啓動應用程序時連接到他們自己的數據庫。這意味着,在一個表單中,他們將輸入用戶名,密碼,主機名和他們自己的數據庫的名稱。我檢查連接,如果失敗,它會向用戶顯示錯誤消息,如果它有效,應用程序的其餘部分開始,emplyee可以訪問他的個人數據。如何讓用戶連接到Yii2中的數據庫?

我沒有所有這些數據庫及其憑據的列表。它只有誰知道他們的emplyee。

我用這個作爲參考Yii2 Create Database Connection。這是一個經常遇到的問題,但所有的答案都是關於CActiveRecord和Yii2中不再提供的東西。

我在web.php文件中評論了db組件,並將其添加到控制器中。問題是,模型在自舉階段連接到一個不存在的db,在重定向到index時產生錯誤。

如何讓模型知道Yii::$app配置中更改的連接?

這是我在控制器動作:

public function actionConnect() { 
    $model = new DBcomponents(); 
    if (Yii::$app->request->isAjax && $model->load($_POST)) 
{ 
    Yii::$app->response->format = 'json'; 
    return \yii\widgets\ActiveForm::validate($model); 
} 
    if ($model->load(Yii::$app->request->post())) 
{ 
     // Create Test DB Connection 
     $form = $model; 
     $dsn ='mysql:host='.$form->newhost.';dbname='.$form->dbname; 
     $config = Yii::$app->getComponents(); 


     $db = new \yii\db\Connection([ 
       'dsn'  => $dsn, 
       'username' => $form->username, 
       'password' => $form->password, 
       'charset' => 'utf8' 
       ]); 
     $db->open(); 
     try { 
     // Check DB Connection 
     if ($db->getIsActive()) { 
     // Write Config 
      $db->close(); 
      $config['components']['db'] = $db; 
      Yii::$app->setComponents($config['components']); 
      Yii::$app->db->open(); 
      $success = TRUE; 
      return $this->redirect(['index']); 
     }else{ 
      $errorMsg = 'Incorrect Configurations'; 
     } 
     } catch (Exception $e) { 
      $errorMsg = $e->getMessage(); 
     } 
      } 
    else{ 
return $this->render('dbcreate', [ 
    'model' => $model, 
]);} 
} 
+0

我找到了解決問題的方法。我很快會解釋它的答案。 – mada

回答

0

於是我意識到我不得不這樣做。

我沒有在db的配置文件中寫任何東西。我把它放在控制器裏,你可以在這裏看到。但是,一旦我離開控制器,我就失去了這個配置。爲了保持它並能夠將它用於模型,我將這個新連接保存在緩存中。然後,正如qiang在這裏建議的:http://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/我覆蓋了getDbConnection()靜態方法,它在Yii2中被稱爲getDb()。爲此,我創建了一個NewActiveRecord類,它擴展了ActiveRecord。然後,我用我所有的方法擴展了這個新班級。請注意,如果緩存發生任何事情,應用程序將失敗。

除此之外,它工作正常。這並不完美,因爲這樣做會導致永久加載我的應用程序的頁面,因爲模型每次都會連接。如果有人知道如何改善這一點,請幫忙。 這是我的新班。

<?php 
namespace app\models; 
use Yii; 
class NewActiveRecord extends \yii\db\ActiveRecord { 

public static function getDb() { 
return Yii::$app->cache['dbconnect']; 

}}