2013-05-23 13 views
5

Sono un principiante in ZF2 Sono riuscito a utilizzare più BDD sulla stessa applicazione e funziona. (Sto parlando di questo: configure multiple databases in zf2).Configurare connessioni multi DB su ZF2

però, mi piacerebbe avere una piccola domanda ...

è ok per dichiarare la mia fabbrica personalizzato in global.php? (nella cosa service_manager). Oppure devo dichiararlo all'interno di ogni modulo? (In module.php)

Dichiarare in global.php funziona actualy, ma mi chiedevo se non è rompere lo spirito del quadro o qualcosa del genere ...

Grazie per il vostro tempo!

Tounu

risposta

7

Conservare le impostazioni di connessione in una configurazione locale:

config/autoload/local.php 

questo è nel caso in cui si dispone di più ambienti con credenziali diverse basi di dati/collegamento ecc, ad esempio, è possibile che ha dato una configurazione messa in scena e una configurazione live, entrambi con un database separato. In questo modo è anche possibile utilizzare più connessioni all'interno dell'applicazione.

non c'è nulla che impedisca la creazione di connessioni multiple a qui, e li utilizzano come necessario nei vostri adattatori di database, ecc

local.php

return array(
    /** 
    * Database Connection One 
    */ 
    'db' => array(
     'driver' => 'pdo', 
     'dsn'  => 'mysql:dbname=dbnamehere;host=localhost', 
     'username' => 'root', 
     'password' => '', 
    ), 
    /** 
    * Database Connection Two 
    */ 
    'db_two' => array(
     'driver' => 'pdo', 
     'dsn'  => 'mysql:dbname=anotherdb;host=localhost', 
     'username' => 'root', 
     'password' => '', 
    ), 

Se si utilizza il controllo di versione (dovresti esserlo!) questo ti consente anche di escludere i file di configurazione .local dal tuo repository per evitare di archiviare la password ecc. e di facilitare la distribuzione in più ambienti.

È possibile impostare più adattatori per utilizzare le connessioni diverse troppo:

global.php

return array(
    /** 
    * Database Adapter(s) 
    */ 
    'service_manager' => array(
     'factories' => array(
      /** 
      * Adapter One - this factory will use the default 'db' connection 
      */ 
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
      /** 
      * Adapter Two - use the second connection 
      */ 
      'Application\Db\AdapterTwo' => function($sm) { 
       $config = $sm->get('Config'); 
       return new Adapter($config['db_two']); 
      }, 
     ), 
    ), 
); 
+0

Grazie, ha aiutato! – Tounu

+0

Little edit - in global.php Devo aggiungere path alla classe: 'return new Zend \ Db \ Adapter \ Adapter ($ config ['db_two']);' – user2047861

2

Per collegare più database alla volta, attenersi alla seguente procedura:

Fase 1 :

Creare/modulo/MyModule/e aggiungere in application.config.ini per accedere.

Fase 2: Crea Module.php in// MyModule/directory modulo con i seguenti script

<?php 

    namespace MyModule; 
    use MyModule\MyAdapterFactory; 
    use Zend\ModuleManager\Feature\ServiceProviderInterface; 

    class Module implements ServiceProviderInterface{ 

public function getAutoloaderConfig() 
{  
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(        
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__.'/Db/Adapter/', 
      ), 
     ), 
    ); 
} 

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'adapter1' => new MyAdapterFactory('db_adapter1'), 
      'adapter2' => new MyAdapterFactory('db_adapter2'), 
     ),  
    ); 

} 

} 

Fase 3:

Creare MyAdapterFactory.php nel percorso:/modulo/MyModule/src/MyModule/Db/Adapter/con i seguenti script.

<?php 

    namespace MyModule; 
    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]); 
     } 
     } 

    ?> 

Fase 4:

Aggiungere i seguenti script nella vostra getServiceConfig().

   'YourModule\Model\YourTable' => function($sm) { 
       $tableGateway = $sm->get('YourTableGateway'); 
       $table = new YourTable($tableGateway); 
       return $table; 
      }, 
      'YourTableGateway' => function ($sm) { 
       $adapter1 = $sm->get('adapter1');     
       $resultSetPrototype = new ResultSet(); 
       $resultSetPrototype->setArrayObjectPrototype(new YourModel()); 
       return new TableGateway('tbl_name', $adapter1, null,     $resultSetPrototype); 
      }, 

Fase 5:

metodo Add nel controller per accedere alla tabella come di seguito:

Dichiarare questo all'avvio della classe:

protected $ this-> YourTable ;

public function getYourTable() 
{ 
    if (!$this->yourTable) { 
     $sm = $this->getServiceLocator(); 
     $this->yourTable = $sm->get('YourModule\Model\YourTable'); 
    }  
    return $this->yourTable; 
} 

Quindi, è possibile chiamare i metodi di modello per Select, Update, Insert utilizzando questa funzione (getYourTable()) nel controller.

Problemi correlati