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

2022-08-30 20:50:08
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?

    }
}

答案 1

您始终可以获得对前端控制器的引用:

$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");

另请参阅我对“为 Zend 应用程序提供数据库处理程序的”正确“方法的回答


答案 2

太糟糕了,插件中没有像's这样的东西。您始终可以通过前端控制器获取引导引用: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
}

更容易,数据库几乎可以在应用程序中的任何位置检索。


推荐