CakePHP3更改插件中的数据库连接

时间:2017-11-19 14:16:48

标签: php cakephp cakephp-3.x

我在CakePHP3中切换数据库连接时遇到问题。

我想更改数据库连接(基于子域,MultiTenant系统)。但我想将此连接更改外包给插件。 为此我写了一个带有中间件类的小插件(MTA),具有以下调用函数:

    public function __invoke($request, $response, $next)
    {
        $response = $next($request, $response);
        $tenantMap = TableRegistry::get('TenantMappings');
        $mapping = $tenantMap->findByName($request->subdomains()[0])->firstOrFail();
        ConnectionManager::config("alias_".$request->subdomains()[0], [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            'username' => '***username***',
            'password' => '***password***',
            'database' => '***database***',
            'encoding' => 'utf8',
            'timezone' => 'UTC',
            'cacheMetadata' => true,
        ]); 
        ConnectionManager::alias ("alias_".$request->subdomains()[0], "default");
        Configure::write('Account.active', $mapping->account_id);


        return $response;
    }

这不起作用。也许改变连接或设置别名已经太晚了。

是否仍有可能更改插件中所有模型的连接,或者我是否必须提前执行此操作(例如在bootstrap.php中)?

1 个答案:

答案 0 :(得分:1)

对于在该点之后被实例化的所有表,这应该可以正常工作,但是您需要将$next()调用(调用队列中的下一个middlware)移动到方法的末尾,否则您的代码应用程序请求完成后将运行