zf2で複数のデータベースを構成する 質問する

zf2で複数のデータベースを構成する 質問する

Zend Framework 2 で複数のデータベースを構成 (および使用) するにはどうすればよいでしょうか? 現在、global.php に次の内容があります:

return array(
    'db' => array(
        'driver'         => 'Pdo',
        'dsn'            => 'mysql:dbname=my_db;host=localhost',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
        'username' => 'user',
        'password' => '******',
    ),
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
        ),
    ),
);

しかし、2 つ目を追加する方法がわかりません。

ベストアンサー1

Zend\Db\Adapter\AdapterServiceFactory を見ると、アダプタ構成が 1 つのキーのみを指していることがわかります'db'。つまり、構築されるアダプタは常にこの (一意の) 構成キーを使用します。

次のような独自のファクトリーを作成することをお勧めします。

namespace Your\Namespace;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\Db\Adapter\Adapter;

class MyAdapterFactory implements FactoryInterface
{

  protected $configKey;

  public function __construct($key)
  {
      $this->configKey = $key;
  }

  public function createService(ServiceLocatorInterface $serviceLocator)
  {
      $config = $serviceLocator->get('Config');
      return new Adapter($config[$this->configKey]);
  }
}

メイン モジュール (またはその他のモジュール) で、Module.php ファイルに次のコードを追加して、Zend Service Manager へのアダプタ ファクトリを宣言します。

use Your\Namespace\MyAdapterFactory;
use Zend\ModuleManager\Feature\ServiceProviderInterface;

class Module implements ServiceProviderInterface{

//Previous code

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'myadapter1'        => new MyAdapterFactory('dbconfigkey1'),
            'myadapter2'        => new MyAdapterFactory('dbconfigkey2'),
            ),
       );

}

//...

グローバル設定は次のようになります。

return array(
'dbconfigkey1' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=my_db;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
    'username' => 'user',
    'password' => '******',
),

'dbconfigkey2' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=my_db2;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
    'username' => 'user',
    'password' => '******',
),

);

アダプタを使用するには、サービス マネージャを使用してアダプタを呼び出す必要があります。

$adapter1=$serviceManager->get('myadapter1');
$adapter2=$serviceManager->get('myadapter2');

バージョン2.2以降

抽象サービス ファクトリは、zf2 Zend\Db モジュールの一部になりました。'adapters' サブキーの下に複数の設定キーを追加できます。

'db'=> array(
    'adapters'=>array(
        'adapter' => array(
            'driver'         => 'Pdo',
            'dsn'            => 'mysql:dbname=test;host=localhost',
            'username' => 'readCredential',
            'password' => '****'
        ),
        'adapter2' => array(
            'driver'         => 'Pdo',
            'dsn'            => 'mysql:dbname=test;host=localhost',
            'username' => 'rwCredential',
            'password' => '****'
        ),
    )
),

ただし、AbstractServiceFactory はデフォルトでは追加されないため、「手動で」追加する必要があります。

'service_manager' => array(
    'abstract_factories' => array(
            'Zend\Db\Adapter\AdapterAbstractServiceFactory',
    )
),

アダプタは以前と同じようにアクセスできます:

$adapter1=$serviceManager->get('adapter');
$adapter2=$serviceManager->get('adapter2');

パフォーマンスの観点からは、この 2 番目のアプローチの方が優れています。1 つのオブジェクト (抽象ファクトリ) がインスタンス化され、(潜在的に) さまざまなアダプタが作成されます。一方、前のアプローチでは、構成ごとに 1 つのオブジェクトが作成されました。

おすすめ記事