Yii2模块具有不同的数据库

时间:2018-11-26 16:49:01

标签: yii2 yii2-module

我想结合两个应用程序。其中之一作为模块。有两个不同的数据库。该模块使用另一个数据库作为基本应用程序。

我已经创建了数据库连接,它是config.php中的一个组件

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=test_db',
    'username' => 'root',
    'password' => '',    
    'charset' => 'utf8',
];

并且我创建了一个ModuleActiveRecord类,该类将覆盖Active Record函数getDB():

class ModuleActiveRecord extends ActiveRecord
{
    public static function getDb()
    {
        $db = Yii::$app->controller->module->db;
        return Yii::createComponent($db);
}

我收到错误消息:该表不存在。 有人知道吗?

2 个答案:

答案 0 :(得分:1)

复制数据库连接文件,并在config(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');
}

答案 1 :(得分:1)

您可以像其他答案一样添加多个数据库连接,例如: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(尽管这是您所期望的,尽管以特殊方式调用了它)
  • 该模块以外的代码无法查看有关此数据库的配置。
  • 即使该模块没有特殊的数据库连接,也可以使用上述方法正确调用默认的数据库连接(也许这不是您所期望的)
  • 可以清楚地表明此处使用了特殊的数据库连接配置

注意:这只是覆盖模块中应用程序默认组件的一种方法,以供参考。我没有练习过这种方法,但是我已经测试了它的可行性。