Что такое «правильный» способ предоставить Zend-приложение обработчик базы данных - PullRequest
6 голосов
/ 14 ноября 2009

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

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

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

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

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

1 Ответ

18 голосов
/ 15 ноября 2009

Идея состоит в том, что ваша 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();
        }
    }
}

Кроме того, вы можете написать собственный метод init в своем классе 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);
    }
  }
}

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...