Zend Framework 2 中与 DB 的动态连接

Dynamic connection to DB in Zend Framework 2

我有 3 种类型的数据库:

用户通过 Authen DB 登录并验证后。

根据Config DB中的信息存储,ZF2应用程序中与服务相关的所有操作都应在相关的服务DB[=46=上完成].

ZF2支持这种情况吗?我该如何解决?


下面的代码是我的global.php和local.php。

global.php

return array(
    'db' => array(
        // primary database
        'driver'    => 'Pdo',
        'dsn'       => 'mysql:host=xxx.xxx.xxx.xxx;dbname=db_authen',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        ),
        // other database
        'adapters' => array(
            'db_config' => array(
               'driver'         => 'Pdo',
               'dsn'            => 'mysql:host=yyy.yyy.yyy.yyy;dbname=db_config',
               'driver_options' => array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
                    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                ),
            ),
        ),
    ),
    'service_manager' => array(
        // primary database
        'factories' => array(
            'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
            'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory'
        ),
        // other database
        'abstract_factories' => array(
            'Zend\Db\Adapter\AdapterAbstractServiceFactory',
        ),
    ),
);

local.php

return array(
    'db' => array(
        // primary database
        'username' => '*****',
        'password' => '*****',

        // other database
        'adapters' => array(
            'db_config' => array(
                'username' => '*****',
                'password' => '*****',
            ),
        ),
    ),
);

谢谢,

在针对(静态配置的)Auth DB 进行身份验证并查阅(静态配置的)Config DB 以获取服务 DB 所需的动态信息后,您可能可以为自己实例化正确的 DB 适配器服务数据库,使用类似:

// Config from the Config DB, packaged into an array with keys that 
// are expected by \Zend\Db\Adapter\Adapter
$config = [
    'driver' => 'Pdo_Mysql', // for example
    'user' => 'my-dynamically-obtained-user',
    'password' => 'my-dynamically-obtained-password',
    'database' => 'my-dynamically-obtained-db-name',
    // etc
];
$adapter = new \Zend\Db\Adapter\Adapter($config);

// Now use the $adapter to build queries
$statement = $adapter->query('SELECT * FROM `mytable`');
$results = $statement->execute();

// iterate over the results, etc.

或者,您可以将 $adapter 提供给您创建的模型对象,该对象对消费者隐藏特定于数据库的查询详细信息。

ZF2 docs for \Zend\Db\Adapter\Adapter