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

时间:2010-06-03 23:36:22

标签: php zend-framework

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?

    }
}

4 个答案:

答案 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();