DB接続設定を連想配列で
ひさしぶりにEthnaで小ネタ。
etc/sample-ini.php
<?php $config => array( //...snip... // @see http://pear.php.net/manual/ja/package.database.db.intro-connect.php 'dsn' => array( 'phptype' => 'mysql', 'username' => 'rw_user', 'password' => 'password', 'hostspec' => 'master', 'database' => 'database', ), 'dsn_r' => array( array( 'phptype' => 'mysql', 'username' => 'ro_user', 'password' => 'password', 'hostspec' => 'slave1', 'database' => 'database', ), array( 'phptype' => 'mysql', 'username' => 'ro_user', 'password' => 'password', 'hostspec' => 'slave2', 'database' => 'database', ), ), //...snip... ); ?>
app/Sample_Controller.php
<?php class Sample_Controller extends Ethna_Controller { //...snip... // @override function _prepareDSN() { $r = array(); foreach ($this->db as $key => $value) { $config_key = "dsn"; if ($key != "") { $config_key .= "_$key"; } $dsn = $this->config->get($config_key); if (is_array($dsn) && is_int(key($dsn))) { // 種別1つにつき複数DSNが定義されている場合はアクセス分岐 $dsn = $this->_selectDSN($key, $dsn); } $r[$key] = $dsn; } return $r; } //...snip... } ?>
Ethna_Controller::_prepareDSN()をオーバーライドして、DSNが配列だったときの判定を追加。(「is_int(key($dsn))」のところ)