YII2。通过路由更改数据库连接

YII2. Change db connection by routing

我需要通过路由更改数据库连接(前缀), 当用户路由到站点时。com/db1/post 系统使用 db1 组件配置,当路由到站点时。com/db2/post 系统使用 db2

'components' => [
'db1' => [
     ...,
    'tablePrefix' => 'base1_',
],
 'db2' => [
     ...,
     'tablePrefix' => 'base2_',
],
...

这可能吗? 也许有更好的解决方案来更改数据库前缀。 我需要使用一个具有不同 table 的模型(仅更改前缀)

一个简单的解决方案与高级模板类似..在

中您有两个不同的应用程序具有不同的配置部分..
/db1/config/main.php  

您可以将数据库组件设置为访问您喜欢的 table 前缀(或您喜欢的数据库)

'components' => [
  'db' => [
 ...,
     'tablePrefix' => 'base1_',
  ],

并在

  /db2/config/main.php  

'components' => [
  'db' => [
 ...,
     'tablePrefix' => 'base2_',
  ],

您可以将公共命名空间用于您需要的所有公共应用程序元素..模型、控制器、视图等..
以及特定元素的每个保留名称空间..

显然这只是一个建议..可能还有其他简单而聪明的解决方案

PS: 使用两个独立的数据库你不需要不同的前缀..

有几个选项。可能最简单的是使用 url 规则;见 http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html#url-rules

rules => [
    '<db:db\d>/post' => 'site/post',
]

这会将 db1/post 重定向到 site/post,并将 "db" 参数设置为 "db1"。然后在您的 SiteController 中:

public function actionPost($db) {
    YourModel::setDb(Yii::$app->$db);
    $model = new YourModel();
    // do what you need with your model
    // and return the rendered result
}

在您的模型 class 中,您需要覆盖 getDb() 静态方法,并编写一个 setDb 方法:

private static $_db;

public static function getDb() {
    if (isset(self::$_db)) {
        return self::$_db;
    }
    return ActiveRecord::getDb();
}

public static function setDb($db) {
    self::$_db = $db;
}