2013-05-23 3 views
5

Я действительно новичок в ZF2 Мне удалось использовать несколько BDD в одном приложении, и оно работает. (я говорю об этом: configure multiple databases in zf2).Настроить несколько соединений DB на ZF2

Хотя, я бы немного вопрос ...

Это нормально, чтобы объявить свой собственный завод в global.php? (в службе service_manager). Или мне нужно объявить его внутри каждого модуля? (В module.php)

Объявив его в global.php actualy работает, но мне было интересно, если это не нарушает дух рамок или что-то ...

Спасибо за ваше время!

Tounu

ответ

7

Храните настройки подключения в локальной конфигурации:

config/autoload/local.php 

это в случае, если у вас есть несколько сред с различными учетными данными базы данных/подключения и т.д., например, вы можете дали установку промежуточной , и живую настройку, использующую отдельную базу данных. Вы также можете использовать несколько подключений внутри своего приложения.

нет ничего, чтобы остановить вас настройки нескольких соединений в здесь, и использовать их по мере необходимости адаптеров баз данных и т.д.

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

Если вы используете систему управления версиями (вы должны быть!) это также позволяет исключить файлы .local config из вашего репозитория, чтобы избежать сохранения пароля и т. д. там, и позволяет упростить развертывание в нескольких средах.

Вы можете настроить несколько адаптеров использовать различные соединения тоже:

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

Спасибо, это помогло! – Tounu

+0

Little edit - in global.php Мне нужно добавить путь к классу: 'return new Zend \ Db \ Adapter \ Adapter ($ config ['db_two']);' – user2047861

2

Для подключения нескольких баз данных в то время, выполните следующие действия:

Шаг 1 :

Создать/модуль/MyModule/и добавить в application.config.ini для доступа.

Шаг 2: Создание module.php в/модуля/MyModule/директории со следующими сценариями

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

} 

} 

Шаг 3:

Создание MyAdapterFactory.php в пути:/модуль/MyModule/src/MyModule/Db/Adapter/со следующими скриптами.

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

    ?> 

Шаг 4:

Добавьте следующие скрипты в вашем 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); 
      }, 

Шаг 5:

метод Add в контроллер, чтобы получить доступ к таблице, как показано ниже:

Объявите это на старте класса:

защищенный $ this-> yourTable ;

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

Затем, Вы можете позвонить модельных методов Select, Update, Insert, используя эту функцию (getYourTable()) в контроллере.

Смежные вопросы