ドキュメントには、MasterSlaveFeature へのパラメーターとしてスレーブ アダプターと共に、MasterSlaveFeature を TableGateway コンストラクターに渡すことにより、マスター スレーブを実行する機能が記載されています。私の質問は、TableGateway オブジェクトをインスタンス化するときにそのスレーブ アダプターにアクセスする方法です。
クイックスタートに従って、メインのグローバル構成ファイルとローカル構成ファイルにマスターを設定しています。スレーブ アダプタの設定方法と複数のスレーブの設定方法を教えてください。
これを行う方法の実例はありますか?
更新: 私はこれについていくつかの進歩を遂げました。グローバル構成ファイルで、slave という別の配列キーを追加し、そこに接続情報を入力しました。次に、Zend\Db\Adapter\AdapterServiceFactory の動作を模倣する SlaveAdapterServiceFactory クラスを作成しましたが、"db" の代わりに "slave" 構成キー値を取得します。次に、マスター アダプターのコンストラクター インジェクションを行うモジュール構成で、スレーブ アダプターも取得し、それをモデル テーブルにコンストラクター パラメーターとして新しい MasterSlaveFeature インスタンスに渡します。また、モデル テーブル クラスを変更して、コンストラクターで渡される機能を探す必要がありました。モーダル テーブル クラスは AbstractTableGateway を拡張するため、Feature をどう処理するかを知っていると思います。うまくいけば、その仮定は正しいです。これはすべて本当に混乱しているように聞こえます!ここにいくつかのコードがあります。最初に、config/autoload ディレクトリから global.php を取得します。
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2test;host=one.host.com',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'slave' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2test;host=two.host.com',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter'
=> 'Zend\Db\Adapter\AdapterServiceFactory',
'My\Db\Adapter\SlaveAdapter'
=> 'My\Db\Adapter\SlaveAdapterServiceFactory'
),
)
);
モジュールの module.config.php ファイルのコードは次のとおりです。
return array(
'service_manager' => array(
'factories' => array(
'Album\Model\AlbumTable' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$slaveAdapter = $sm->get('My\Db\Adapter\SlaveAdapter');
$table = new AlbumTable($dbAdapter, new MasterSlaveFeature($slaveAdapter));
return $table;
}
)
)
);
クエリが実際に正しい接続に接続されているかどうかをテストする機会はありませんでしたが、エラーは発生していません。
もう 1 つの問題は、インスタンス化するすべてのモデルに対してこれを行うのではなく、作成されるすべてのモデルにこれらのアダプターを自動的に渡す方法です。