开发者

Module based application.ini in Zend Framework

开发者 https://www.devze.com 2023-03-08 11:45 出处:网络
I want to have module based application.ini in my application. Is it possible? Basic requirement arises because I am having multiple databases depend开发者_StackOverflow社区ing on modules.

I want to have module based application.ini in my application.

Is it possible?

Basic requirement arises because I am having multiple databases depend开发者_StackOverflow社区ing on modules.

Please guide.


You can use multiple Db in 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   = ""

And initialize in your bootstrap:

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

In my case I always save each adapter in the registry so I can use them separately later. I also made a new class which extend Zend_Db_table where I have My own getAdapter($name) like so:

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

With that in each model I can do:

$this->getAdapter('slave')->fecthAll($sql);
$this->getAdapter('master')->fecthAll($sql);


The application.ini is read long before the module is determined. I'd suggest you forget about application.ini and instead try and write a controller plugin that will load in some additional configuration depending on which module was selected.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号