该文档提到了通过将 MasterSlaveFeature 传递给 TableGateway 构造函数以及从适配器作为 MasterSlaveFeature 的参数来进行主从的能力。我的问题是如何在实例化 TableGateway 对象时访问该从适配器。
根据快速入门,我正在主要的全局和本地配置文件中设置我的主文件。我将如何配置从适配器以及如何设置多个从适配器?
是否有一个如何做到这一点的工作示例?
更新:我在这方面取得了一些进展。在全局配置文件中,我添加了另一个名为 slave 的数组键,并在那里输入了连接信息。然后我创建了一个 SlaveAdapterServiceFactory 类,它模仿 Zend\Db\Adapter\AdapterServiceFactory 的行为,但获取“slave”配置键值而不是“db”。然后,在我进行主适配器的构造函数注入的模块配置中,我还获取从适配器并将其作为构造函数参数传递给我的模型表,并传递给新的 MasterSlaveFeature 实例。我还必须更改我的模型表类以查找在构造函数中传递的 Feature 内容。由于模态表类扩展了 AbstractTableGateway,我希望它知道如何处理该功能。希望这个假设是正确的。这一切听起来真的很混乱!这是一些代码。首先是 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;
}
)
)
);
我没有机会测试查询是否真的进入了正确的连接,但我没有收到任何错误。
另一个问题是如何自动将这些适配器传递给任何创建的模型,而不必为您实例化的每个模型执行此操作。