Konfigurieren Sie mehrere Datenbanken in zf2

Lesezeit: 5 Minuten

Konfigurieren Sie mehrere Datenbanken in zf2
tihe

Wie kann ich mehrere Datenbanken in Zend Framework 2 konfigurieren (und verwenden)? Derzeit habe ich dies in meiner 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(
            'ZendDbAdapterAdapter' => 'ZendDbAdapterAdapterServiceFactory',
        ),
    ),
);

Aber ich sehe keine Möglichkeit, einen zweiten hinzuzufügen.

1643915646 823 Konfigurieren Sie mehrere Datenbanken in zf2
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'),
            ),
       );

}

//...

Die globale Konfiguration sollte nun so aussehen:

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' => '******',
),

);

Um die Adapter zu verwenden, müssen Sie sie mit dem Service Manager aufrufen:

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

Ab Version 2.2

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:

'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' => '****'
        ),
    )
),

Die AbstractServiceFactory muss jedoch “manuell” hinzugefügt werden, da dies standardmäßig nicht der Fall ist:

'service_manager' => array(
    'abstract_factories' => array(
            'ZendDbAdapterAdapterAbstractServiceFactory',
    )
),

Die Adapter sind wie bisher zugänglich:

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

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.

    – jechabbi

    15. März 13 um 20:36 Uhr

Ich fand eine viel bessere Erklärung auf https://samsonasik.wordpress.com/2013/07/27/zend-framework-2-multiple-named-db-adapter-instances-using-adapters-subkey/

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:

  1. 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’, ), ),

  2. 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

'db' => array(
    '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''
            ),
        ),
    ),
),
  1. Konfigurieren Sie den Unterschlüssel „adapters“ unter dem Schlüssel „db“. config/autoload/local.php

//config/autoload/local.php

return array(
    'db' => array(
        'adapters' => array(
            'db1' => array(
                'username' => 'root',
                'password' => '',
            ),
            'db2' => array(
                'username' => 'other_user',
                'password' => 'other_user_passwd',
            ),
        ),
    ),
);
  1. 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',
            ),
        ),
    ),
);

.

759100cookie-checkKonfigurieren Sie mehrere Datenbanken in zf2

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy