如何让用户在Yii2中连接到数据库?

时间:2016-09-05 13:54:01

标签: php database yii2

我有一个适用于某种数据库结构的Yii应用程序。我的公司几乎每个企业都有这样一个数据库。因此,我希望用户在启动应用程序时能够连接到自己的数据库。这意味着,在一个表单中,他们将输入用户名,密码,主机名和他们自己的数据库的名称。我检查连接,如果失败,它将向用户显示一条错误消息,如果它有效,应用程序的其余部分启动,并且员工可以访问他的个人数据。

我没有所有这些数据库及其凭据的列表。它只是知道他们的人。

我用它作为参考Yii2 Create Database Connection。这是一个经常遇到的问题,但所有答案都是关于CActiveRecord和Yii2中不再提供的内容。

我评论了db文件中的web.php组件并将其添加到控制器中。问题是,模型在引导阶段连接到不存在的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,
]);}
 }

1 个答案:

答案 0 :(得分:0)

所以我意识到我必须做的事情。

我没有在db的配置文件中写任何内容。我在控制器中设置了它,正如你在这里看到的那样。但是,一旦我离开控制器,我就失去了这个配置。为了保留它并能够将它用于模型,我将这个新连接保存在缓存中。然后,正如qiang在这里建议的那样:http://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/我覆盖了getDbConnection()静态方法,在Yii2中称为getDb()。为此,我创建了一个扩展NewActiveRecord的{​​{1}}类。然后我让我的所有方法都扩展了这个新类。请注意,如果缓存发生任何事情,应用程序将失败。

除此之外,它工作正常。不完美,因为这种方式使得加载我的应用程序的页面需要永远,因为模型每次都进行连接。如果有人知道如何改善这一点,请提供帮助。 这是我的新课。

ActiveRecord