Конфигурация базы данных для конкретного модуля в Zend Framework - PullRequest
1 голос
/ 01 февраля 2010

Я хочу, чтобы один из моих модулей Zend Framework использовал базу данных, отличную от других. В руководстве предлагается , чтобы добиться этого, в application.ini можно добавить префикс ресурсов к имени модуля, но я не могу заставить его работать.

Соответствующие биты моего application.ini:

resources.modules[] = ""

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.dbname = "maindb"
resources.db.params.username = "dbuser"
resources.db.params.password = "..."
resources.db.params.charset = "utf8"

terms.resources.db.params.dbname = "termsdb"

где terms - имя модуля.

Что-нибудь особенное, что мне нужно добавить в Bootstrap, чтобы это работало?

Ответы [ 2 ]

0 голосов
/ 02 марта 2013

Сделайте следующее:

moduleName.host = "localhost"
moduleName.username = "user"
moduleName.password = "pass"
moduleName.dbname = "dbname"
moduleName.charset = "utf8"

Затем добавьте следующее в Bootstrap.php вашего модуля в любой функции инициализации

$params = $GLOBALS['application']->getOption('moduleName');
$dbAdapter = Zend_Db::factory('PDO_MYSQL', array(
    'host' => $params['host'],
    'dbname' => $params['dbname'],
    'username' => $params['username'],
    'password' => $params['password'],
    'charset'  => $params['charset'],
));
Zend_Registry::set('moduleSpecific', $dbAdapter);

Затем в папке model/DbTable/ вашего модуля создайте класс следующим образом и позвольте вашей таблице классифицировать расширение ModuleName_Model_DbTable_Tablemain вместо Zend_Db_Table_Abstract, и вы готовы к работе.

class ModuleName_Model_DbTable_Tablemain extends Zend_Db_Table_Abstract
{
    /**
     * 
     * wrapper class constructor used to set db adaptor on the fly
     * @author Krishan
     */
    function __construct(){

        parent::__construct($adapter = Zend_Registry::get('moduleSpecific'));

    }
}

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

0 голосов
/ 01 февраля 2010

EDIT:

В отношении первого комментария ОП ниже ...

Нет, я не могу подробно описать настройку модульного ресурса БД. То, что я предоставил, должно работать в теории, я верю. Если это не так, я не уверен, что нужно изменить в расширении Zend_Application_Resource_Db, потому что, как я уже говорил, я не использую этот ресурс. У меня есть собственный настраиваемый ресурс, который позволяет создавать несколько БД и извлекать эти БД на основе уникальных имен соединений. Однако я могу уточнить это: -)

Итак, у меня есть класс MyLib_Db, который расширяет Zend_Db, он выглядит примерно так:

class MyLib_Db extends Zend_Db
{
   protected $_instance = null;
   protected $_connections = array();

   /**
    * Standard Zend Framework unified constructor
    * @param null|array An array of options that will be passed to setOptions
    */
   public function __construct($options = null)
   {
   }

   /**
    * Standard Zend Framework setOptions implementation
    * @param array $options and array of options from config
    * @return MyLib_Db
    */
   public function setOptions(array $options)
   {
   }

   /**
    * Set the class instance
    * @param MyLib_Db
    * @return MyLib_Db
    */
   public static function setInstance($instance)
   {
   }

   /**
    * Get/create the singleton instance
    * @return MyLib_Db
    */
   public static function getInstance()
   {
   }

   /**
    * Get a Zend_Db adapter Instance by unique name
    * Searches self::$_connections for the $name param as an array key
    * @param String $name unique connection name
    * @return Zend_Db_Adpater_Abstract|null
    */
   public function getConnection($connectionName)
   {
   }

   /**
    * Add a connection instance to the registry
    * Adds/creates an Zend_Db_Adapter instance to the connection registry with
    * the string key provided by $name. If $connection is an array|Zend_Config it 
    * should match the format used by Zend_Db::factory as it will be passed to this   
    * function. If $name is null then the database name will be used. 
    * @param Zend_Db_Adapter_Abstract|Zend_Config|array The connection to register
    * @param string|null $name A unique name for the connection
    * @return MyLib_Db
    */
   public function addConnection(Zend_Db_Adapter_Abstract $connection, $name = null)
   {
   }

   /**
    * Remove/Destroy the specified connection from the registry
    * @param string $name the connection name to remove
    * @return MyLib_Db
    */
   public function removeConnection($name)
   {
   }
}

Так что в основном мой ресурс приложения для БД создает и возвращает экземпляр предыдущего класса. Во время создания он создает любые адаптеры, которые я настроил в своей конфигурации, и регистрирует их в этом экземпляре класса с именем (он также ищет флаг по умолчанию для использования с Zend_Db_Table, а также для выполнения некоторых других операций).

Тогда я либо использую MyLib_Db::getInstance()->getConnection($name); или я получаю экземпляр MyLib_Db из начальной загрузки и затем вызываю getConnection.

Лично я предпочитаю делать это таким образом, потому что это не зависит от того, будет ли соединение иметь широкое приложение или привязано к конкретному модулю, что позволяет более гибко использовать его повторно. Тем не менее, я фактически использовал это только в нескольких проектах, потому что в большинстве моих проектов Zend я использовал Doctrine вместо Zend_Db.

Надеюсь, это поможет: -)


На самом деле, я думаю, вам нужно указать это в разделе вашего модуля в конфигурации, например modules.terms.resources.db.*. Это должно заставить его загружаться в модуль начальной загрузки. В качестве альтернативы вы можете вручную настроить его с _initDb в вашем Terms_Bootstrap.

Лично я использую специальный класс управления БД и помещаю его в свои ресурсы вместо этого - он обрабатывает установку одного или нескольких адаптеров. Затем предположим, что $db является менеджером, полученным из массива ресурсов ...

$dbAdapter = $db->getConnection('terms');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...