y2k*_*y2k 19 php zend-framework
protected function _initDatabase()
{
$params = array(
'host' => '',
'username' => '',
'password' => '',
'dbname' => '',
);
$database = Zend_Db::factory('PDO_MYSQL', $params);
$database->getConnection();
return $database;
}
Run Code Online (Sandbox Code Playgroud)
.
class App_Controller_Plugin_Test extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Http $request)
{
// how i get database?
}
}
Run Code Online (Sandbox Code Playgroud)
Bil*_*win 31
您始终可以获得前端控制器的引用:
$front = Zend_Controller_Front::getInstance();
Run Code Online (Sandbox Code Playgroud)
从那里你可以得到引导:
$bootstrap = $front->getParam("bootstrap");
Run Code Online (Sandbox Code Playgroud)
从引导程序中,您可以获得引导程序插件:
if ($bootstrap->hasPluginResource("database")) {
$dbResource = $bootstrap->getPluginResource("database");
}
$db = $dbResource->getDatabase();
Run Code Online (Sandbox Code Playgroud)
但这是一个额外的管道!
老实说,在引导期间将数据库适配器对象存储在注册表中会更好:
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;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在任何地方获得数据库适配器
Zend_Registry::get("database");
Run Code Online (Sandbox Code Playgroud)
另请参阅我对使用数据库处理程序提供Zend应用程序的"正确"方法的回答
太糟糕了,没有什么样Zend_Controller_Action的getInvokeArg("bootstrap")一个插件.您始终可以通过前端控制器获取引导程序引用:
$db = Zend_Controller_Front::getInstance()->getParam("bootstrap")->getResource("database");
Run Code Online (Sandbox Code Playgroud)
但我通常做的是
Zend_Registry::set('database', $database);
Run Code Online (Sandbox Code Playgroud)
然后在你的插件中:
try
{
$db = Zend_Registry::get('database');
}
catch (Zend_Exception $e)
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
更容易,并且可以在应用程序的任何位置检索数据库.
[我需要检查另一台机器上的一些工作代码.我相信它是这样的...]
$db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db');
Run Code Online (Sandbox Code Playgroud)