Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php zend 2:在自动加载配置中组织我的数据库适配器_Php_Zend Framework2 - Fatal编程技术网

Php zend 2:在自动加载配置中组织我的数据库适配器

Php zend 2:在自动加载配置中组织我的数据库适配器,php,zend-framework2,Php,Zend Framework2,我正在编写一个应用程序,不幸的是它必须使用多个数据库。我想这样组织config\autoload\global.php文件中的适配器:(下面的代码不起作用) 因此,您可以看到我希望如何对数据库适配器进行逻辑分组,然后将它们传递给“db”配置中的“adapters”数组。这将是有利的,因为我可以通过服务管理器配置中的逻辑分组来引用我的适配器(通过它们循环),如下所示: $config = $this->getServiceLocator()->get('config'); $appDo

我正在编写一个应用程序,不幸的是它必须使用多个数据库。我想这样组织config\autoload\global.php文件中的适配器:(下面的代码不起作用)

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

$config = $this->getServiceLocator()->get('config');
$appDomain1 = $config['appDomain1'];
$dbAdapters = $this->getServiceLocator()->get('config')['db']['adapters'];
foreach ($dbAdapters as $dbAdapter) {
    if (array_key_exists('myAppType', $dbAdapter)) {
        if ($dbAdapter['myAppType'] === 'appDomain2' ) {
            var_dump($dbAdapter);
        }
    }
}
不过,我不能像上面的代码那样传入它们,因为适配器数组不需要像我的“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'键,如下所示:

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

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

你所做的没有什么问题,但它比你以前的设置更不实用。但是,您可以编写自己的适配器工厂并使用旧结构。这并不难,因为您可以使用标准适配器工厂中的几乎所有代码