Jeśli spojrzysz na Zend \ Db \ Adapter \ AdapterServiceFactory, zobaczysz, że konfiguracja Twojego adaptera wskazuje tylko jeden klucz 'db'
. Oznacza to, że adapter, który tworzy, zawsze będzie używał tego (unikalnego) klucza konfiguracyjnego.
polecam Ci stworzyć własną fabrykę, która będzie wyglądać następująco:
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]);
}
}
w głównym module (lub jakikolwiek inny), dodaj poniższe do pliku Module.php zadeklarować fabryki adapterów do 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'),
),
);
}
//...
globalna konfiguracja powinna wyglądać następująco:
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' => '******',
),
);
używać adapterów musisz zadzwonić do nich za pomocą Service Manager:
$adapter1=$serviceManager->get('myadapter1');
$adapter2=$serviceManager->get('myadapter2');
Począwszy od wersji 2.2
Abstracts Service Factory jest teraz częścią ZF2 modułu Zend \ Db. Możliwe jest dodawanie przycisków konfiguracyjnych wielokrotności pod klucz „sub-adaptery”:
'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' => '****'
),
)
),
Jednak AbstractServiceFactory muszą być dodane „ręcznie”, ponieważ nie jest tak domyślnie:
'service_manager' => array(
'abstract_factories' => array(
'Zend\Db\Adapter\AdapterAbstractServiceFactory',
)
),
Adaptery są dostępne, jak poprzednio:
$adapter1=$serviceManager->get('adapter');
$adapter2=$serviceManager->get('adapter2');
z punktu widzenia wydajności to drugie podejście jest lepsze: jeden obiekt zostanie instancja (The abstract factory) do (potencjalnie) cREAT e różne adaptery. Podczas gdy w poprzednim podejściu został utworzony jeden obiekt na konfigurację.
Czy tego rodzaju strategii zmieniło w 2.1? – Saeven
Po krótkim spojrzeniu na Zend \ Db \ Adapter \ AdapterServiceFactory nie sądzę. – yechabbi
Nice 2.2 info, thanks. – Xunnamius