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 つのオブジェクトが作成されました。