2010-06-03 28 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();

相關問題