Модуль на основе application.ini в Zend Framework - PullRequest
0 голосов
/ 25 мая 2011

Я хочу иметь приложение application.ini на основе модуля.

Возможно ли это?

Основное требование возникает из-за наличия нескольких баз данных в зависимости от модулей.

Пожалуйста, руководство.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Вы можете использовать несколько БД в application.ini:

resources.db.master.adapter          = "PDO_MYSQL"
resources.db.master.default          = false
resources.db.master.params.dbname    = "db1"
resources.db.master.params.host      = "127.0.0.1"
resources.db.master.params.username  = "root"
resources.db.master.params.password  = ""
resources.db.slave.adapter           = "PDO_MYSQL"
resources.db.slave.default           = true
resources.db.slave.params.dbname     = "db2"
resources.db.slave.params.host       = "127.0.0.1"
resources.db.slave.params.username   = "root"
resources.db.slave.params.password   = ""

И инициализируйте в вашей начальной загрузке:

    public function _initDatabase() {
        $config = $this->getApplication()->getOption('resources');

        $dbArrays = array();
        foreach($config['db'] as $name => $dbConf){
            // Set up database
            $db = Zend_Db::factory($dbConf['adapter'], $dbConf['params']);
            $db->query("SET NAMES 'utf8'");
            $dbArrays[$name] = $db;

            if((boolean)$dbConf['default']){                
                Zend_Db_Table::setDefaultAdapter($db);
            }
            unset($db);
        }

        Zend_Registry::set("db", $dbArrays);
    }

В моем случае я всегда сохраняю каждый адаптер в реестре, чтобы потом использовать их отдельно. Я также создал новый класс, расширяющий Zend_Db_table, где у меня есть собственный getAdapter ($ name), например:

    public function getAdapter($name = null){
        if($name !== null){
            $dbAdapters = Zend_Registry::get('db');
            return $dbAdapters[$name];
        }
        return parent::getAdapter();
    }

С этим в каждой модели я могу сделать:

$this->getAdapter('slave')->fecthAll($sql);
$this->getAdapter('master')->fecthAll($sql);
1 голос
/ 25 мая 2011

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

...