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