サイトの多チャネル化に伴いDB接続を動的に変更したい
cakephpで同一サイト内で柔軟にdb接続を切り替えたい場合がある。
例えば、ショッピングサイトであれば一般商品を扱うサイトとアダルト向け商品を扱うサイトでdbを分けたいなどの場合が考えられる。もしくは、多言語展開を行おうとしているサイトであれば、日本語と英語でdbを分けたいとケースが考えられる。
cakephpではそのような要件に柔軟に対応できる方法がある。
データベース接続設定を複数用意する
cakephpにおけるdbの接続先設定は、
app\Config\database.php
に記述されている。標準の設定だと、defaultという接続先設定が利用されるようになっている。複数dbで切り替えて運用する場合には、この接続先を複数定義しておくことが前提。具体的には、以下のようにしておく。
public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => 'pass', 'database' => 'defalut', 'prefix' => '', 'encoding' => 'utf8', ); public $other = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => 'pass', 'database' => 'other', 'prefix' => '', 'encoding' => 'utf8', );
接続を切り替える方法
上の例では、defaultとotherを設定してある。では、db接続を切り替えるにはどうすればよいか。以下のように記述すれば可能。
$this->useDbConfig = 'other';
上の切り替え設定をどこに記述すればよいか。
app\Model\AppModel.php
に記述すればdbは常にotherへと接続される。システム内で条件によって動的に切り替える場合はどうすればよいか。
AppModelで動的に接続設定を初期化する
AppModel.phpに以下のように設定すれば動的に切り替えることが可能。
class AppModel extends Model { function __construct() { parent::__construct(); if( strpos(DOMAIN, "adult-") !== false ) { $this->useDbConfig = 'adult'; } elseif( strpos(DOMAIN, ".com") !== false ) { $this->useDbConfig = 'com'; } } }
上の例は、DOMAINというurlが格納された定数にadult-が含まれる場合は、adultへdb接続を行い、.comが含まれている場合は、comへと接続する。それ以外は、defaultのdb接続情報を利用する。
cakephpでは、db接続を柔軟に変更することが可能。