如果你看一下了Zend \ DB \適配器\ AdapterServiceFactory,你會看到你的適配器配置點,只需一鍵'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服務經理:
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' => '******',
),
);
使用則需要使用服務管理器來調用它們適配器:
截至目前版本2.2
一個抽象的服務廠是ZF2 Zend的\ DB模塊的一部分。這是可能的「適配器」子鍵下添加倍數配置鍵:
'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');
從性能的角度來看,這第二個方法是較好的:一個對象將被(抽象工廠)實例化以(潛在)穿心蓮e不同的適配器。而在以前的方法中,每個配置創建一個對象。
出現這種策略在2.1改變了嗎? – Saeven
快速查看Zend \ Db \ Adapter \ AdapterServiceFactory後,我不這麼認爲。 – yechabbi
不錯2.2信息,謝謝。 – Xunnamius