1

该文档提到了通过将 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;
            }
        )
    )
);

我没有机会测试查询是否真的进入了正确的连接,但我没有收到任何错误。

另一个问题是如何自动将这些适配器传递给任何创建的模型,而不必为您实例化的每个模型执行此操作。

4

1 回答 1

0

这应该可以帮助您:MasterSlaveFeature How-To

然而,在 ZF2 的这个领域与当前的开发人员交谈似乎确实存在一个错误。我已经根据他的建议提交了一份报告,所以一旦解决了,我展示的示例应该可以工作,并结合你所拥有的 =)

于 2012-12-06T15:17:50.927 回答