zend 2:在autoload配置中组织我的数据库适配器

时间:2014-04-07 19:53:26

标签: php zend-framework2

我正在编写一个应用程序,遗憾的是必须使用多个DB。我想在我的config \ autoload \ global.php文件中组织适配器,如下所示:(下面的代码不起作用)

'appDomain1' => array(
    'Db1' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db1;host=myserver',
        'username' => 'red',
        'password' => '123456',
    ),
    'Db2' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db2;host=myserver',
        'username' => 'red',
        'password' => '123456',
    ),
    'Db3' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db3;host=myserver',
        'username' => 'red',
        'password' => '123456',
    ),
),
'appDomain2' => array(
    'Db5' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db5;host=myserver',
        'username' => 'red',
        'password' => '123456',
    ),
    'Db6' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db6;host=myserver',
        'username' => 'red',
        'password' => '123456',
    ),
    'Db7' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db7;host=myserver',
        'username' => 'red',
        'password' => '123456',
    ),
),

'db' => array(
    //Default adapter
    'driver' => 'Pdo_Mysql',
    'dsn' => 'mysql:dbname=defaultDB;host=myserver',
    'username' => 'red',
    'password' => '123456',
    //'driver_options' => array(
    //  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    //),
    'adapters' => array(
        'appDomain1',
        'appDomain2',
    ),
),

因此,您可以看到我希望如何对数据库适配器进行逻辑分组,然后将它们传递给适配器'数组在' db'配置。这将是有利的,因为我可以通过他们在服务管理器配置中的逻辑分组来引用我的适配器(以循环它们),如下所示:

$config = $this->getServiceLocator()->get('config');
$appDomain1 = $config['appDomain1'];

我不能像上面的代码那样传递它们,因为适配器数组不期望嵌套数组,例如我的' appDomain1'和' appDomain2'阵列。

如何在逻辑上将我的适配器分组?

编辑: 我提出了以下解决方案,但不确定我做的是不是很糟糕。我发现我可以将自己的自定义键与适配器数组中的嵌套数组一起使用并使用它(这是一个坏主意吗?)。

现在我在autoload下的global.php \ local.php中执行以下操作:

'db' => array(
    //Default adapter
    'driver' => 'Pdo_Mysql',
    'dsn' => 'mysql:dbname=defaultDB;host=myserver',
    'username' => 'red',
    'password' => '123456',
    //'driver_options' => array(
    //  PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    //),
    'adapters' => array(
    'Db5' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db5;host=myserver',
        'username' => 'red',
        'password' => '123456',
        'myAppType' => 'appDomain1',
    ),
    'Db6' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db6;host=myserver',
        'username' => 'red',
        'password' => '123456',
        'myAppType' => 'appDomain2',
    ),
    'Db7' => array(
        'driver' => 'Pdo_Mysql',
        'dsn' => 'mysql:dbname=db7;host=myserver',
        'username' => 'red',
        'password' => '123456',
        'myAppType' => 'appDomain3',
    ),
    ),
),

现在我可以提取自定义' myAppType' => ' appDomainX' 键我这样添加:

$dbAdapters = $this->getServiceLocator()->get('config')['db']['adapters'];
foreach ($dbAdapters as $dbAdapter) {
    if (array_key_exists('myAppType', $dbAdapter)) {
        if ($dbAdapter['myAppType'] === 'appDomain2' ) {
            var_dump($dbAdapter);
        }
    }
}

这是一个可行的解决方案吗?对我来说似乎很好,但我想确保这不是一个nono。

1 个答案:

答案 0 :(得分:0)

您正在做的事情没有任何问题,但它比您之前的设置更不实用。但是,您可以编写自己的Adapter Factory并使用旧的结构。这并不难,因为您几乎可以使用标准Adapter Factory中的所有代码。