我在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中)?
答案 0 :(得分:1)
对于在该点之后被实例化的所有表,这应该可以正常工作,但是您需要将$next()
调用(调用队列中的下一个middlware)移动到方法的末尾,否则您的代码应用程序请求完成后将运行。