Каков «правильный» способ предоставления приложения Zend с помощью обработчика базы данных

Предполагая, что вы внимательно относитесь к соглашениям ZendApplication , где вы должны настраивать обработчик базы данных для разработчиков приложений для доступа?

Я знаю, как настроить адаптер ZendDb . Я хочу знать, что в контексте Zend Framework разработчики должны создавать экземпляры своих обработчиков БД, поэтому им не нужно беспокоиться о нескольких экземплярах в одном запросе, каждый раз предоставляя учетные данные и т. Д.

Например, когда разработчик использует Code Igniter и ему нужно выполнить произвольный запрос, на контроллере есть обработчик базы данных.

$this->db->query(.... 

Каков эквивалент Zend этого соглашения? Чтобы быть ясным, я могу придумать полдюжины способов выполнить это, используя инструменты, которые предоставляет Zend Framework. Я ищу, как Zend Framework в общем случае хочет, чтобы вы это сделали.

Идея заключается в том, что ваш Bootstrap читает файл конфигурации и объявляет записи конфигурации для описания адаптера базы данных, который вы хотите создать:

 [bootstrap] resources.db.adapter = Pdo_Mysql resources.db.params.dbname = "mydatabase" resources.db.params.username = "webuser" resources.db.params.password = "XXXX" resources.db.isDefaultTableAdapter = true 

Если вы используете ключи конфигурации, соответствующие правильному соглашению, это автоматически сигнализирует базовому классу Bootstrap для создания и инициализации объекта Zend_Application_Resource_Db и сохраняет его в реестре ресурсов начальной загрузки .

Позже в вашем контроллере вы можете получить доступ к реестру ресурсов. примечание: я отредактировал этот код после тестирования его немного больше.

 class SomeController extends Zend_Controller_Action { public function init() { $bootstrap = $this->getInvokeArg("bootstrap"); if ($bootstrap->hasPluginResource("db")) { $dbResource = $bootstrap->getPluginResource("db"); $db = $dbResource->getDbAdapter(); } } } 

Кроме того, вы можете написать собственный метод инициализации в вашем классе Bootstrap, чтобы сохранить объект в Zend_Registry по умолчанию:

 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initDb() { if ($this->hasPluginResource("db")) { $dbResource = $this->getPluginResource("db"); $db = $dbResource->getDbAdapter(); Zend_Registry::set("db", $db); } } } 

Теперь вы можете получить доступ к своему объекту db за один шаг вместо трех:

 class SomeController extends Zend_Controller_Action { public function init() { $db = Zend_Registry::get("db"); } } 

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