具有不同数据库的 Yii2 模块
Yii2 Module with different database
我想合并两个应用程序。其中之一作为模块。有两个不同的数据库。该模块使用另一个数据库作为基础应用程序。
我已经创建了数据库连接,它是 config.php
中的一个组件
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_db',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
并且我创建了一个 ModuleActiveRecord Class 覆盖了 Active Record 函数 getDB():
class ModuleActiveRecord extends ActiveRecord
{
public static function getDb()
{
$db = Yii::$app->controller->module->db;
return Yii::createComponent($db);
}
我收到错误消息:table 不存在。
有人有想法吗??
复制数据库连接文件并在配置中导入两个连接 (web.php):
'components' => [
...
'db' => require(__DIR__ . '/db.php'),
'db_copy' => require(__DIR__ . '/db_copy.php'),
]
然后像这样覆盖使用复制数据库的 ActiveRecord 中的数据库连接:
public static function getDb()
{
return Yii::$app->get('db_copy');
}
您可以像其他答案一样添加多个数据库连接,例如:db/db_for_module。
你也可以像我一样配置模块(以Yii2高级模板为例):
// in common/config/main.php
[
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_db',
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
],
'modules' => [
'v1' => [
'class' => \frontend\modules\v1\Module::class,
// Increase the component configuration of the module
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_db_for_module',
'username' => 'root',
'password' => '111111',
'charset' => 'utf8',
],
],
],
],
]
v1 模块的定义
// in frontend/modules/Module.php
<?php
namespace frontend\modules\v1;
/**
* v1 module definition class.
*/
class Module extends \yii\base\Module
{
/**
* {@inheritdoc}
*/
public $controllerNamespace = 'frontend\modules\v1\controllers';
}
但是,您必须在模块的代码中以特殊方式调用db组件,例如:
// in frontend/modules/v1/controllers/TestController.php
<?php
namespace frontend\modules\v1\controllers;
/**
* Test Controller
*/
class TestController extends \yii\web\Controller {
public function actionTest()
{
\Yii::$app->modules['v1']->db->createCommand(...); // This db points to the db connection of this module configuration
// or
$this->module->db->createCommand(...) // This db points to the db connection of this module configuration
}
}
这样做的好处:
- 您可以使用相同的名称:db(如果这是您所期望的,尽管它是以一种特殊的方式调用的)
- 除此模块外的代码看不到有关此数据库的配置。
- 即使您没有此模块的特殊数据库连接,您仍然可以使用上述方法正确调用默认数据库连接(也许这不是您所期望的)
- 可以明确指出这里使用了特殊的db连接配置
注意:这只是一种覆盖模块中应用默认组件的方法,供参考。这个方法我没有实践过,但是我测试过这个是可行的。
我想合并两个应用程序。其中之一作为模块。有两个不同的数据库。该模块使用另一个数据库作为基础应用程序。
我已经创建了数据库连接,它是 config.php
中的一个组件return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_db',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
];
并且我创建了一个 ModuleActiveRecord Class 覆盖了 Active Record 函数 getDB():
class ModuleActiveRecord extends ActiveRecord
{
public static function getDb()
{
$db = Yii::$app->controller->module->db;
return Yii::createComponent($db);
}
我收到错误消息:table 不存在。 有人有想法吗??
复制数据库连接文件并在配置中导入两个连接 (web.php):
'components' => [
...
'db' => require(__DIR__ . '/db.php'),
'db_copy' => require(__DIR__ . '/db_copy.php'),
]
然后像这样覆盖使用复制数据库的 ActiveRecord 中的数据库连接:
public static function getDb()
{
return Yii::$app->get('db_copy');
}
您可以像其他答案一样添加多个数据库连接,例如:db/db_for_module。
你也可以像我一样配置模块(以Yii2高级模板为例):
// in common/config/main.php
[
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_db',
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
],
'modules' => [
'v1' => [
'class' => \frontend\modules\v1\Module::class,
// Increase the component configuration of the module
'components' => [
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_db_for_module',
'username' => 'root',
'password' => '111111',
'charset' => 'utf8',
],
],
],
],
]
v1 模块的定义
// in frontend/modules/Module.php
<?php
namespace frontend\modules\v1;
/**
* v1 module definition class.
*/
class Module extends \yii\base\Module
{
/**
* {@inheritdoc}
*/
public $controllerNamespace = 'frontend\modules\v1\controllers';
}
但是,您必须在模块的代码中以特殊方式调用db组件,例如:
// in frontend/modules/v1/controllers/TestController.php
<?php
namespace frontend\modules\v1\controllers;
/**
* Test Controller
*/
class TestController extends \yii\web\Controller {
public function actionTest()
{
\Yii::$app->modules['v1']->db->createCommand(...); // This db points to the db connection of this module configuration
// or
$this->module->db->createCommand(...) // This db points to the db connection of this module configuration
}
}
这样做的好处:
- 您可以使用相同的名称:db(如果这是您所期望的,尽管它是以一种特殊的方式调用的)
- 除此模块外的代码看不到有关此数据库的配置。
- 即使您没有此模块的特殊数据库连接,您仍然可以使用上述方法正确调用默认数据库连接(也许这不是您所期望的)
- 可以明确指出这里使用了特殊的db连接配置
注意:这只是一种覆盖模块中应用默认组件的方法,供参考。这个方法我没有实践过,但是我测试过这个是可行的。