我有一个适用于某种数据库结构的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,
]);}
}
答案 0 :(得分:0)
所以我意识到我必须做的事情。
我没有在db
的配置文件中写任何内容。我在控制器中设置了它,正如你在这里看到的那样。但是,一旦我离开控制器,我就失去了这个配置。为了保留它并能够将它用于模型,我将这个新连接保存在缓存中。然后,正如qiang在这里建议的那样:http://www.yiiframework.com/forum/index.php?/topic/5385-dynamic-db-connection/我覆盖了getDbConnection()
静态方法,在Yii2中称为getDb()
。为此,我创建了一个扩展NewActiveRecord
的{{1}}类。然后我让我的所有方法都扩展了这个新类。请注意,如果缓存发生任何事情,应用程序将失败。
除此之外,它工作正常。不完美,因为这种方式使得加载我的应用程序的页面需要永远,因为模型每次都进行连接。如果有人知道如何改善这一点,请提供帮助。 这是我的新课。
ActiveRecord