Zend Framework — адаптер БД в конструкторе равен нулю

#php #database #zend-framework #adapter

#php #База данных #zend-framework #адаптер

Вопрос:

Версия ZF: 1.11.2

Я хочу создать абстрактный класс, который содержит мой адаптер БД. Упрощенно это выглядит так:

 <?php
class Application_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
    protected $_dbAdapter = null;

    /**
     * @return null
     */
    public function getDbAdapter()
    {
        return $this->_dbAdapter;
    }

    /**
     * @param null $dbAdapter
     */
    public function setDbAdapter($dbAdapter)
    {
        $this->_dbAdapter = $dbAdapter;
    }

    public function __construct()
    {
        Zend_Debug::dump($this->getAdapter(), 'Datei: ' . __FILE__ . '<br/>Zeile: ' . __LINE__, true); die;
    }
}
  

Но мой дамп возвращает null. В базовом классе модели (который расширяется от Zend_D b_Table_Abstract) тот же дамп возвращает объект Zend_Db_Adapter_Pdo_Mysql. Почему?

Комментарии:

1. Как бы вы ожидали, что это сработает? Ни в коем случае в вашем примере вы не устанавливаете адаптер БД.

2. getAdapter() — это метод Zend_Db_Table_Abstract. итак, на мой взгляд, я должен получить адаптер по умолчанию или я ошибаюсь?

Ответ №1:

Я немного взглянул на исходный код Zend DB, просто чтобы освежить свою память. Если вы измените свой конструктор на этот:

 public function __construct($config = array())
{
    parent::__construct($config);

    Zend_Debug::dump($this->getAdapter(), 'Datei: ' . __FILE__ . '<br/>Zeile: ' . __LINE__, true); die;
}
  

Он должен работать больше так, как вы ожидаете.

Отвечая на вопрос из вашего комментария: getAdapter() метод Zend_Db_Table_Abstract просто возвращает все, что находится в переменной адаптера БД. Он ничего не делает с значением по умолчанию. Кроме того, поскольку ваш класс переопределяет этот метод, вместо него будет использоваться ваша версия.

Конструктор в Zend_Db_Table_Abstract классе установит значение по умолчанию, если оно не было предоставлено, поэтому вызов родительского конструктора, как в моем примере, должен гарантировать, что установлен адаптер по умолчанию.

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