Модуль Yii2 с другой базой данных - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу объединить два приложения.Один из них как модуль.Есть две разные базы данных.Модуль использует другую базу данных в качестве базового приложения.

Я создал соединение БД, которое является компонентом в 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 голосов
/ 27 ноября 2018

Вы можете добавить несколько соединений с базой данных, как и другие ответы, например: 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
    }
}

Преимущества выполненияthis:

  • Вы можете использовать то же имя: db (если это то, что вы ожидаете, хотя он и называется особым образом)
  • Код, отличный от этого модуля, не можетсм. конфигурацию об этой базе данных.
  • Даже если у вас нет специального подключения к базе данных для этого модуля, вы все равно можете правильно вызвать подключение к базе данных по умолчанию, используя описанный выше метод (возможно, это не то, что вы ожидаете)
  • Может четко указывать, что здесь используется специальная конфигурация соединения с БД.

Примечание. Это просто способ переопределить компоненты приложения по умолчанию в модуле дляссылка.Я не практиковал этот метод, но я проверил это возможно.

0 голосов
/ 26 ноября 2018

Скопируйте файл соединения db и импортируйте оба соединения в config (web.php):

'components' => [
    ...
    'db' => require(__DIR__ . '/db.php'),
    'db_copy' => require(__DIR__ . '/db_copy.php'),
]

Затем переопределите соединение db в ActiveRecord, которое использует копию db следующим образом:

public static function getDb()
{
    return Yii::$app->get('db_copy');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...