Aber ich sehe keine Möglichkeit, einen zweiten hinzuzufügen.
jechabbi
Wenn Sie sich ZendDbAdapterAdapterServiceFactory ansehen, werden Sie sehen, dass Ihre Adapterkonfiguration nur auf einen Schlüssel zeigt 'db'. Das bedeutet, dass der von ihm erstellte Adapter immer diesen (eindeutigen) Konfigurationsschlüssel verwendet.
Ich empfehle Ihnen, Ihre eigene Fabrik zu erstellen, die so aussehen würde:
namespace YourNamespace;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
use ZendDbAdapterAdapter;
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]);
}
}
Fügen Sie in Ihrem Hauptmodul (oder einem anderen Modul) Folgendes zur Datei Module.php hinzu, um die Adapter-Factories für den Zend Service Manager zu deklarieren:
use YourNamespaceMyAdapterFactory;
use ZendModuleManagerFeatureServiceProviderInterface;
class Module implements ServiceProviderInterface{
//Previous code
public function getServiceConfig()
{
return array(
'factories' => array(
'myadapter1' => new MyAdapterFactory('dbconfigkey1'),
'myadapter2' => new MyAdapterFactory('dbconfigkey2'),
),
);
}
//...
Eine Abstract Service Factory ist jetzt Teil des zf2 ZendDb-Moduls. Es ist möglich, mehrere Konfigurationsschlüssel unter dem Unterschlüssel „Adapter“ hinzuzufügen:
Aus Leistungssicht ist dieser zweite Ansatz besser: Ein Objekt wird instanziiert (die abstrakte Fabrik), um (möglicherweise) die verschiedenen Adapter zu erstellen. Während im vorherigen Ansatz ein Objekt pro Konfiguration erstellt wurde.
Hat sich diese Art von Strategie in 2.1 geändert?
– Saeven
14. März 13 um 17:15 Uhr
Nach einem kurzen Blick auf die ZendDbAdapterAdapterServiceFactory glaube ich nicht.
Zend Framework 2.2 kommt mit abstract_factories ZendDbAdapterAdapterAbstractServiceFactory die es uns ermöglichen, mehrere benannte DB-Adapterinstanzen zu konfigurieren. Dies ist Schritt für Schritt, um es zu tun:
Registrieren ZendDbAdapterAdapterAbstractServiceFactory Geben Sie bei „abstract_factories“ unter „service_manager“ ein.
//config/autoload/global.php //…. Teil von config/autoload/global.php ‘service_manager’ => array( ‘abstract_factories’ => array( ‘ZendDbAdapterAdapterAbstractServiceFactory’, ), ),
Konfigurieren Sie den Unterschlüssel „adapters“ unter dem Schlüssel „db“. config/autoload/global.php
//config/autoload/global.php //…. Teil von config/autoload/global.php
Rufen Sie den Adapter mit „db1“ oder „db2“ als DB-Adapter von ServiceManager auf
$sm->get(‘db1’);
$sm->get(‘db2’);
Wenn Sie bekommen müssen $sm->get(‘ZendDbAdapterAdapter’) als Primäradapter, ‘db1’ und ‘db2’ als andere Adapter für bestimmte Zwecke, dann müssen Sie den Primäradapter direkt unter db definieren, also die Konfiguration von config/autoload/global.php wird wie folgt sein:
//config/autoload/global.php
return array(
'db' => array(
//this is for primary adapter....
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf21_learn;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES 'UTF8''
),
//other adapter when it needed...
'adapters' => array(
'db1' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2_staging;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES 'UTF8''
),
),
'db2' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2_test;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES 'UTF8''
),
),
),
),
'service_manager' => array(
// for primary db adapter that called
// by $sm->get('ZendDbAdapterAdapter')
'factories' => array(
'ZendDbAdapterAdapter'
=> 'ZendDbAdapterAdapterServiceFactory',
),
// to allow other adapter to be called by
// $sm->get('db1') or $sm->get('db2') based on the adapters config.
'abstract_factories' => array(
'ZendDbAdapterAdapterAbstractServiceFactory',
),
),
);
Der config/autoload/global.local.php sollte auch wie folgt konfiguriert werden:
//config/autoload/local.php
return array(
'db' => array(
// for primary db adapter that called
// by $sm->get('ZendDbAdapterAdapter')
'username' => 'root',
'password' => '',
// to allow other adapter to be called by
// $sm->get('db1') or $sm->get('db2') based on the adapters config.
'adapters' => array(
'db1' => array(
'username' => 'root',
'password' => '',
),
'db2' => array(
'username' => 'other_user',
'password' => 'other_user_passwd',
),
),
),
);
.
7591000cookie-checkKonfigurieren Sie mehrere Datenbanken in zf2yes