2014-04-07 2 views
0

불행히도 여러 DB를 사용해야하는 응용 프로그램을 작성 중입니다. 나는이처럼 내 구성 \ 자동로드 \의 global.php 파일 어댑터를 구성하고 싶습니다 : 당신은 내가 원하는 방법zend 2 : 자동로드 구성에서 데이터베이스 어댑터 구성

그래서
'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'배열과 같은 중첩 배열을 기대하지 않기 때문입니다.

내 어댑터를 어떻게 논리적으로 그룹화 할 수 있습니까?

편집 : 다음 해결책을 생각해 냈지만 확실하지는 않습니다. 난 그냥 어댑터 배열에 중첩 된 배열로 내 자신의 사용자 지정 키를 던져 그것을 사용할 수있는 발견 (이것은 나쁜 생각입니까?).

는 지금은 자동로드에서 내 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' 키 I 추가 픽업 할 수 있습니다 다음과 같이하십시오 :

$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가 아닌지 확인하고 싶다.

답변

0

당신이하고있는 것에는 아무런 문제가 없지만 이전 설정은 덜 실용적입니다. 그러나 자신의 어댑터 팩토리를 작성하고 이전 구조를 사용할 수 있습니다. 표준 Adapter Factory에있는 거의 모든 코드를 사용할 수 있기 때문에 그렇게 어렵지 않습니다.

관련 문제