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))」のところ)