Проблема с конкретной конфигурацией модуля 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"

.....

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

Ответ 1

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

Здесь точное слово, взятое из файла download (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, вы увидите ее очень мощной.

Ответ 2

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

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

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

Ответ 3

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

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