проблема с конкретной конфигурацией модуля zend

iam с помощью zend framework для создания веб-службы REST, и я использую модули для разделения моих версий api.

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

У меня была такая структура каталогов:

- application - modules - v1 - controllers - models - views - configs - module.ini - v2 - controllers - models - views - configs - module.ini - configs - application.xml - library 

У меня уже есть соединение с базой данных, указанное в моем приложении «application.ini» внутри приложения / configs. Я читал здесь о специфических модульных контурах и пробовал.

Я удалил эти параметры базы данных из application.ini и поместил его в module.ini:

 [production] resources.db.adapter = PDO_MYSQL resources.db.params.host = 127.0.0.1 resources.db.params.username = myuser resources.db.params.password = mypwd resources.db.params.dbname = my_db resources.db.params.profiler.enabled = "true" resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug" 

…..

Но я получил сообщение об ошибке «Нет адаптера найдено …», когда я обращался к базе данных в контроллере моего модуля. Пожалуйста помоги…

Solutions Collecting From Web of "проблема с конкретной конфигурацией модуля zend"

Решение (My_App), которое вы ссылаетесь в своем вопросе, не требует дополнительной настройки для подключений к конкретным модулям или любой другой конфигурации, специфичной для модуля (кроме маршрутов). Все, что вам нужно сделать, это объявить ресурс MultiDb в application.ini как db1. Затем вы можете объявить любой ресурс базы данных конкретного модуля в соответствующем модуле модуля module.ini, как db2, db3, db4 … и т. Д. … вам не нужна дополнительная настройка. Я разместил пример в файле загрузки в своем github. Не игнорировать ответ «mingos» выше, но нет необходимости в дополнительном коде в My_App .

Вот точный глагол, взятый из загрузки (application.ini):

 ...if this resource is declared here, then it will be available to all modules. If different db resources need to be used for different modules then MultiDB resource can be initiated. Example: A general db resource can be defined here and a module specific db can be declared in its corresponding module.ini. The db resource declared in the module will not be available to other modules but the db resource in this application.ini will be available to all modules... 

Затем он объявляет один ресурс db в качестве примера в загрузке. Просто измените его на ресурс multi db. Объявите широко используемый ресурс db в приложении application.ini и любом дополнительном ресурсе db, который необходим для любого конкретного модуля в их соответствующих файлах module.ini. Это просто. Это все, что вам нужно сделать. Как только вы поймете логику My_App, вы увидите, что она очень мощная.

В бутстрапе вы можете установить соединения с базой данных:

 protected function _initDb () { $config['my_db1'] = new Zend_Config_Ini(APPLICATION_PATH . '/configs/my_db1.ini'); $config['my_db2'] = new Zend_Config_Ini(APPLICATION_PATH . '/configs/my_db2.ini'); $my_db1 = new Plugin_Replication($config['my_db1']->toArray()); $my_db1->query("SET CHARACTER SET utf8;"); $my_db2 = new Plugin_Replication($config['my_db2']->toArray()); $my_db2->query("SET CHARACTER SET utf8;"); Zend_Db_Table::setDefaultAdapter($dmy_db1); Zend_Registry::set('my_db1', $my_db1); Zend_Registry::set('my_db2', $my_db2); } 

Каждое соединение указывается в отдельном файле .ini в моем случае. Я нахожу это довольно интуитивно организованным. В файле ini базы данных не требуются имена resources.db.whatever . Моя так:

 [Master] host = "xxx" username = "xxx" password = "xxx" dbname = "xxx" charset = utf8 [Slaves] first.host = "xxx" first.username = "xxx" first.password = "xxx" first.dbname = "xxx" first.charset = utf8 second.host = "xxx" second.username = "xxx" second.password = "xxx" second.dbname = "xxx" second.charset = utf8 

Когда у вас есть несколько баз данных, настроенных таким образом, при создании модели (в любом желаемом модуле) вы можете сообщить ZF о базе данных, которую вы хотели бы использовать:

 protected function _setupDatabaseAdapter() { $this->_db = Zend_Registry::get('my_db1'); } 

Это будет ваш адаптер по умолчанию. Если вам нужно использовать две базы данных в одном запросе, запустите функцию вашей модели с помощью:

 public function myAwesomeSqlQuery () { $db1 = $this->getAdapter()->getConfig(); //default adapter $db2 = Zend_Registry::get('my_db2')->getConfig(); //additional adapter 

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

 $sql = $this ->select() ->setIntegrityCheck(false) ->from(array('col1' => $db1['dbname'].'.some_column')) ->join(array('col2' => $db2['dbname'].'.some_other_column')),'col1.id = col2.id') ; 

Как я уже сказал в комментарии, вы также можете использовать модульные бутстрапы. Структура будет выглядеть следующим образом:

 /application/ -- /modules/ -- /v1/ -- /controllers/ -- /views/ -- /Bootstrap.php -- /v2/ -- /controllers/ -- /views/ -- /Bootstrap.php 

Бутстрапы, специфичные для модуля, построены так же, как и любой другой загрузочный файл, но они влияют на рассматриваемый модуль. Названия классов обычно имеют префикс имен модулей, например:

 <?php class V1_Bootstrap extends Zend_Application_Bootstrap_Bootstrap { ... } 

Обычно я стараюсь не использовать модульные бутстрапы, потому что все они запускаются с каждым запросом (Zend Framework 2 должен исправить это), запуская функции, которые не нужны для вашего текущего модуля. Во всяком случае, я нашел модульный бутстрап в одном из моих модулей, который содержит что-то вроде этого:

 class MyModule_Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initLoggers () { $my_db1 = Zend_Registry::get('my_db1'); $my_db2 = Zend_Registry::get('my_db2'); $my_db1->setProfiler(new Zend_Db_Profiler_Firebug())->getProfiler()->setEnabled(true); $my_db2->setProfiler(new Zend_Db_Profiler_Firebug())->getProfiler()->setEnabled(true); $auth = Zend_Auth::getInstance(); $columnMapping = array('priority' => 'priority' , 'message' => 'message' , 'timestamp' => 'timestamp' , 'username' => 'username'); $logger = new Zend_Log(new Zend_Log_Writer_Db($my_db1, 'logs', $columnMapping)); print_r($auth->getIdentity()); if ($auth->hasIdentity()) $logger->setEventItem('username', $auth->getIdentity()->username); Zend_Registry::set('logger', $logger); } 

Это в значительной степени. Я надеюсь, что это помогает.

Решение osebboy не настроено на конфигурационный файл, отличный от .ini. У вас есть application.xml. Похоже, что первоначальная настройка неверна в зависимости от решения osebboy.

Я предлагаю вам загрузить источник из своего github и настроить его таким образом. Также прочитайте его сообщение в блоге об этом.