protected function _initDatabase()
{
$params = array(
'host' => '',
'username' => '',
'password' => '',
'dbname' => '',
);
$database = Zend_Db::factory('PDO_MYSQL', $params);
$database->getConnection();
return $database;
}
class App_Controller_Plugin_Test extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Http $request)
{
// how i get database?
}
}
答案 0 :(得分:31)
您始终可以获得前控制器的参考:
$front = Zend_Controller_Front::getInstance();
从中你可以得到引导程序:
$bootstrap = $front->getParam("bootstrap");
从引导程序中,您可以获得引导程序插件:
if ($bootstrap->hasPluginResource("database")) {
$dbResource = $bootstrap->getPluginResource("database");
}
$db = $dbResource->getDatabase();
但这是一个额外的管道!
老实说,在引导期间将数据库适配器对象存储在注册表中会更好:
protected function _initDatabase()
{
$params = array(
'host' => '',
'username' => '',
'password' => '',
'dbname' => '',
);
$database = Zend_Db::factory('PDO_MYSQL', $params);
$database->getConnection();
Zend_Registry::set("database", $database);
return $database;
}
然后您可以在任何地方获取数据库适配器:
Zend_Registry::get("database");
另请参阅我对What is the “right” Way to Provide a Zend Application With a Database Handler
的回答答案 1 :(得分:6)
太糟糕了,插件中没有Zend_Controller_Action
的{{1}}。您始终可以通过前端控制器获取引导程序引用:
getInvokeArg("bootstrap")
但我通常做的是
$db = Zend_Controller_Front::getInstance()->getParam("bootstrap")->getResource("database");
然后在你的插件中:
Zend_Registry::set('database', $database);
更简单,几乎可以在应用程序的任何位置检索数据库。
答案 2 :(得分:5)
[我需要在另一台机器上查看一些正常工作的代码。我相信它是这样的......]
$db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db');
答案 3 :(得分:0)
$ db = Zend_Db_Table :: getDefaultAdapter();