我正在使用 zend 框架构建 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/configs 中的“application.ini”中提到了数据库连接。我读了 here 关于模块特定的混淆并尝试过。
我从 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"
.....
但是当我在我的模块的 Controller 中访问数据库时,我得到一个错误提示“找不到适配器...”。请帮助...
最佳答案
在 Bootstrap 中,您可以设置数据库连接:
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')
;
正如我在评论中所建议的,您还可以使用特定于模块的 Bootstrap 。结构将是这样的:
/application/
-- /modules/
-- /v1/
-- /controllers/
-- /views/
-- /Bootstrap.php
-- /v2/
-- /controllers/
-- /views/
-- /Bootstrap.php
特定于模块的 Bootstrap 的构造与任何其他 Bootstrap 非常相似,但它们会影响相关模块。类名通常以模块名称为前缀,例如:
<?php
class V1_Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
...
}
我通常尽量不使用特定于模块的 Bootstrap ,因为它们都是随每个请求启动的(Zend Framework 2 应该会纠正此问题),运行当前模块不需要的功能。不管怎样,我在我的一个模块中发现了一个特定于模块的 Bootstrap ,其中包含如下内容:
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);
}
差不多就这些了。希望对您有所帮助。
关于php - zend 模块特定配置的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5190911/