2013-05-23 23 views
5

ZF2 'da yeni başlayan bir girişimciyim, aynı uygulamada birden çok BDD'yi kullanmayı başardım ve işe yarıyor. (Ben bundan bahsediyorum: configure multiple databases in zf2).ZF2'de çoklu DB bağlantılarını yapılandırma

olsa, biraz soru olurdu ...

o global.php benim özel fabrika beyan uygun mudur? (service_manager öğesinde). Veya her modülün içinde bildirmem gerekiyor mu?

(module.php olarak) aslında işleri global.php içine bildirme, ancak çerçevenin ya da bir şey ruhunu ihlal etmiyor ki ... eğer zaman için

Teşekkür merak!

Tounu

cevap

7

Mağaza yerel bir config bağlantı ayarlarınız:

config/autoload/local.php 

bu durumda olduğunu Örneğin vb farklı veritabanları/bağlantı kimlik bilgileriyle birden ortamlar var, bir evreleme kurulum verdi edebilir ve ayrı bir veritabanı kullanarak canlı bir kurulum. Ayrıca, uygulamanızın içinde birden fazla bağlantıyı bu şekilde de kullanabilirsiniz.

burada birden fazla bağlantı kurma sizi durdurmak için hiçbir şey

, vb veritabanı adaptörleri de gerektiğinde bunları kullanarak

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

sürüm kontrolü kullanıyorsanız (Olmanız gerekir!) Bu, şifrenizi vb. depolamaktan kaçınmak için depodan .local config dosyalarını hariç tutmanıza ve birden çok ortama daha kolay dağıtım yapılmasına izin verir.

Sen kurulum birden adaptörler çok farklı bağlantıları kullanmak olabilir:

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

Teşekkürler, yardımcı oldu! – Tounu

+0

Küçük düzenleme - global.php'de sınıfa yeni yol eklemek zorundayım: 'yeni Zend \ Db \ Adapter \ Adapter döndür ($ config ['db_two']);' – user2047861

2

Aynı anda birden çok veri tabanını bağlamak için aşağıdaki adımları izleyin:

1. Adım :

Oluştur/modül/MyModule/ve ekle erişmek için application.config.ini içine.

Adım 2: Module.php oluşturma aşağıdaki komut ile/modül/MyModule/dizinindeki

<?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'), 
     ),  
    ); 

} 

} 

Adım 3:

yolunda MyAdapterFactory.php oluşturun:/Aşağıdaki scriptler ile modül/MyModule/src/MyModule/Db/Bağdaştırıcı /.

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

    ?> 

Adım 4:

sizin getServiceConfig aşağıdaki komut dosyalarını ekleyin().

   '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); 
      }, 

Adım 5: denetleyicisi içine

Add yöntemi olarak aşağıya tabloya ulaşmak için:

sınıfın başından bu bildirmek:

$ this- korumalı> yourTable ;

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

Sonra Sen seç, Update, ekleme denetleyicinizdeki bu işlevi (getYourTable()) kullanmak üzere model yöntemleri çağırabilir.

İlgili konular