Если я не установлю адаптер по умолчанию явно в файле начальной загрузки, 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');
Он должен работать без необходимости явно определять Zend_Db_Table::setDefaultAdapter()
. Вам может не хватить $this->bootstrap('db')
который создает экземпляр вашего ресурса db
.
Вот код, который у меня есть в моем приложении appliction.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); }
ОБНОВИТЬ
Ответ был найден через комментарии, вот результат:
Методы _init + standard resource name
(т. _init + standard resource name
, log, session) запускаются автоматически в вашем бутстрапе, изменяя имя вашего метода _init, который инициализирует ваш db чем-то другим, чем _initDb
чтобы сделать трюк. В противном случае, если вы попытаетесь выполнить $this->bootstrap(*resource name*)
вы получите циклическую зависимость.