Подтвердить что ты не робот

Как получить загрузочный ресурс в плагине контроллера в 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?

    }
}
4b9b3361

Ответ 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

Жаль, что в плагине нет ничего подобного Zend_Controller_Action getInvokeArg("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
}

Легче, и база данных может быть извлечена практически в любом месте приложения.

Ответ 3

[Мне нужно проверить это на некотором рабочем коде на другом компьютере. Я верю, что-то вроде этого...]

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

Ответ 4

$db = Zend_Db_Table:: getDefaultAdapter();