2020年4月6日月曜日

CAKEPHP3.XでDB接続先を動的に変更する

CAKEPHPはバージョンによって、設定方法が違うので見つけるのが大変。。。
ユーザごとに接続先を変更するための方法について覚書

1.接続先の追加

接続先はconfig/app.phpに複数設定が可能です。

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'my_app',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
    ],
    'anothreConnection' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'my_app',
        'password' => 'secret',
        'database' => 'my_app',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
    ]
],

2.テーブル単位での指定

テーブルに、defaultConnectionNameメソッドを追加し、接続先名を指定するとテーブル単位での指定が可能です。

class MyTable extends Table
{
    public static function defaultConnectionName()    {
        return 'anothreConnection';
    }
}

このメソッドは静的メソッドなので、ユーザごとに接続先を変えるのには向きません
(CAKEPHPでは$_SESSIONではなくsessionクラスを推奨しているため)

3.コントロール単位での指定

クエリ毎に設定を変える必要があるなら
ConnectionManagerで接続情報を取得し、$this->connectionで設定します。

use Cake\Datasource\ConnectionManager;

$conn = ConnectionManager::get('anothreConnection');
$this->connection($conn);
こちらであれは、セッションにユーザごとの接続先情報を格納できます。