Нет никаких адаптеров по умолчанию в Zend, если я не добавлю их явно.Это особенность или ошибка? - PullRequest
1 голос
/ 11 августа 2011

Если я не помещаю адаптер по умолчанию явно в файл начальной загрузки, Zend_DB_Tables не имеет адаптеров по умолчанию.Я получаю:

Exception information:
    Message: No adapter found for Application_Model_MyModel

Когда я вставляю загрузчик:

protected function _initDb(){
     //this returns NULL
    //Zend_Debug::dump(Zend_Db_Table::getDefaultAdapter());
    $resource = $this->getPluginResource('db');
    $db = $resource->getDbAdapter();
     // Now it is not NULL
    //Zend_Debug::dump($db);
    Zend_Db_Table::setDefaultAdapter($db);
}

, тогда это работает.

Это нормальное поведение или ошибка в ZendFramework-1.11.10?

мой файл app.ini выглядит следующим образом:

resources.db.adapter = "Pdo_Mysql"
resources.db.isDefaultTableAdapter = true
resources.db.params.dbname = "mydb"
resources.db.params.username = "myuser"
resources.db.params.password = "mypass"
resources.db.params.host = "localhost"
resources.db.params.charset = "UTF8"

РЕДАКТИРОВАТЬ

Оказывается, я не могу использовать _initDb () имя должно быть чем-то другим, иначе я получу проблему с круговой зависимостью, если я выполню $ this-> bootstrap ('db');

1 Ответ

5 голосов
/ 11 августа 2011

Он должен работать без явного определения Zend_Db_Table::setDefaultAdapter(). Возможно, вам не хватает только $this->bootstrap('db'), который создает экземпляр вашего ресурса db.

Вот код, который я имею в моем application.ini

resources.db.adapter                = "Pdo_Mysql"
resources.db.params.host            = "dbhost"
resources.db.params.username        = "username"
resources.db.params.password        = "pass"
resources.db.params.dbname          = "dbname"
resources.db.params.charset         = "utf8"
resources.db.isDefaultTableAdapter  = true
resources.db.profiler.enabled       = true
resources.db.profiler.class         = Zend_Db_Profiler_Firebug

Вот код, который у меня есть в моей начальной загрузке

protected function _initDbAdapter()
{
    $this->bootstrap('db');
    $db = $this->getPluginResource('db');

    // force UTF-8 connection
    $stmt = new Zend_Db_Statement_Pdo(
        $db->getDbAdapter(),
        "SET NAMES 'utf8'"
    );
    $stmt->execute();

    $dbAdapter = $db->getDbAdapter();

    // Query profiler (if enabled and not in production)
    $options = $db->getOptions();
    if ($options['profiler']['enabled'] == true
        && APPLICATION_ENV != 'production'
    ) {
        $profilerClass = $options['profiler']['class'];
        $profiler = new $profilerClass('All DB Queries');
        $profiler->setEnabled(true);
        $dbAdapter->setProfiler($profiler);
    }

    Zend_Registry::set('db', $dbAdapter);
}

UPDATE

Ответ был найден в комментариях, вот результат:

Методы _init + standard resource name (то есть: db, log, session) автоматически запускаются в вашей начальной загрузке, изменяя имя вашего метода _init, который инициализирует вашу базу данных на что-то другое, чем _initDb, должно сработать. В противном случае, если вы попытаетесь сделать $this->bootstrap(*resource name*), вы получите круговую зависимость.

...