【ZF2】複数のDB接続設定


51pQ55vR3xL._SL500_AA300_ZF2の初めての和書、濱田 優さんのZend Framework 2徹底解説、英語苦手な自分には、大変助かってます^^;。

こちらでは、良く使う機能かなぁと思うもので、書籍以外から調べた情報を書いていきたいと思います。あまりZF2の仕組みを理解していないので、見当違いのコードの場合、ご容赦ください。
今日は、DBの複数設定についてです。

実プロジェクトのMysqlの運用では、レプリケーション構成をとることが多いと思います。
画像などを違うスキーマで管理したり、同じテーブルに対しても、SELECTはスレーブから、更新系はマスターへと分けてアクセスします。すると、ModelやTableGatewayにDbAdapterを複数指定できないといけません。

なので、まず<config\autoload\local.php>の設定から

return array(

    /*
    * DB接続設定(.gitignore)
    */
    'db'=> array(
        'adapters'=>array(
            // アプリDB (master)
            'master' => array(
                'driver'         => 'Pdo',
                'dsn'            => 'mysql:dbname=master;host=localhost',
                'username'       => 'db_user',
                'password'       => 'db_pass',
                'driver_options' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ),
            ),
            // アプリDB (slave01)
            'slave' => array(
                'driver'         => 'Pdo',
                'dsn'            => 'mysql:dbname=slave01;host=localhost',
                'username'       => 'db_user',
                'password'       => 'db_pass',
                'driver_options' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
                ),
            ),
            //...その他設定が続く
        )
    ),
);

次に、コントローラにて、

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Model\TableModel;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        // DbAdapterの取得
        $sm = $this->getServiceLocator();
        $dbh = $sm->get('slave01');

        /* 私は、テーブル追加毎にModule.phpを編集する事に抵抗があるので、
           SeviceManagerにfactoryを登録せず、ModelクラスにDbAdapterをキー、
           Modelインスタンスを値にしたハッシュを保持します。*/
        $model = TableModel::getInstance($dbh);
        return new ViewModel(array('rows'=>$model->fetchAll()));
    }
}

Zend Framework 2 でテストごとにDB接続してコネクションが枯渇する
にあります様に、DBコネクション数やプールについても考えなければいけませんね。

今日はここまで。
参考資料:configure multiple databases in zf2