ZF2の初めての和書、濱田 優さんのZend Framework 2徹底解説、英語苦手な自分には、大変助かってます^^;。
こちらでは、良く使う機能かなぁと思うもので、書籍以外から調べた情報を書いていきたいと思います。あまりZF2の仕組みを理解していないので、見当違いのコードの場合、ご容赦ください。
今日は、DBの複数設定についてです。
実プロジェクトのMysqlの運用では、レプリケーション構成をとることが多いと思います。
画像などを違うスキーマで管理したり、同じテーブルに対しても、SELECTはスレーブから、更新系はマスターへと分けてアクセスします。すると、ModelやTableGatewayにDbAdapterを複数指定できないといけません。
なので、まず<config\autoload\local.php>の設定から
[code lang=”php” title=”config\autoload\local.php” firstline=”10″]
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\”
),
),
//…その他設定が続く
)
),
);
[/code]
次に、コントローラにて、
[code lang=”php” title=”module\Application\src\Application\Controller\IndexController.php” firstline=”10″]
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()));
}
}
[/code]
Zend Framework 2 でテストごとにDB接続してコネクションが枯渇する
にあります様に、DBコネクション数やプールについても考えなければいけませんね。
今日はここまで。
参考資料:configure multiple databases in zf2