2010-06-03 46 views
19
protected function _initDatabase() 
{ 
    $params = array(
      'host'  => '', 
      'username' => '', 
      'password' => '', 
      'dbname' => '', 
     ); 

    $database = Zend_Db::factory('PDO_MYSQL', $params); 
    $database->getConnection(); 
    return $database; 
} 

如何在Zend Framework的控制器插件中获得引导程序资源

class App_Controller_Plugin_Test extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Http $request) 
    { 
     // how i get database? 

    } 
} 

回答

31

您可以随时获得前端控制器参考:

$front = Zend_Controller_Front::getInstance(); 

从,你可以得到引导:

$bootstrap = $front->getParam("bootstrap"); 

从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

+0

为什么getResource(“db”)在我的情况下工作,而不是getResource(“数据库”)? – 2011-10-07 11:39:56

+1

它只是根据您在引导配置文件中编写的资源名称使用一个键。例如,如果用'resource.db'前缀你的配置参数,那么它将使用'db'。 – 2011-10-07 13:35:25

5

[我需要检查这与另一台机器上的一些工作代码。我相信这是这样的事情...]

$db = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db'); 
6

太糟糕了,没有什么像Zend_Controller_ActiongetInvokeArg("bootstrap")在插件中。你总是可以得到通过前端控制器引导参考:

$db = Zend_Controller_Front::getInstance()->getParam("bootstrap")->getResource("database"); 

但我通常做的是

Zend_Registry::set('database', $database); 

,然后在你的插件:

try 
{ 
    $db = Zend_Registry::get('database'); 
} 
catch (Zend_Exception $e) 
{ 
    // do stuff 
} 

容易,数据库可以可以在应用程序的任何地方找到。

0

$ db = Zend_Db_Table :: getDefaultAdapter();