Zend Framework -> Zend_Log через application.ini => insert () при ошибке, не связанной с объектом - PullRequest
1 голос
/ 21 марта 2010

Я пытаюсь запустить запись в файл application.ini и застреваю с ошибкой.

resources.log.db.writerName = "Db"
resources.log.db.writerParams.db.adapter = "PDO_SQLITE"
resources.log.db.writerParams.db.dbname = ROOT "/data/tmp.db3"
resources.log.db.writerParams.db.table = "logs"
resources.log.db.writerParams.db.columnMap.priority = "priority"
resources.log.db.writerParams.db.columnMap.message  = "message"

Fatal error: Call to a member function insert() on a non-object in /var/www/libs/zend/library/Zend/Log/Writer/Db.php on line 137

Ответы [ 3 ]

6 голосов
/ 21 марта 2010

Я отправил исправление здесь: http://framework.zend.com/issues/browse/ZF-9497

2 голосов
/ 21 марта 2010

Вы не можете создать экземпляр Database Logger из конфигурации Ini.

Либо настройте Logger в Bootstrap в методе _initLog, либо расширьте обычный класс Zend_Log, чтобы использовать адаптер DB по умолчанию, или лучше, например, для адаптера DB, указанного в application.ini.

Смотрите здесь:


А если вам интересно, почему он не работает из application.ini:

Плагин Log Resource вызовет метод Zend_Log::factory, который, в свою очередь, проверит определенный вами Writer, а затем вызовет метод factory этого Writer для создания нового экземпляра Writer. Но Zend_Log_Writer_Db ожидает, что первый аргумент его конструктора будет Zend_Db_Adapter экземпляром, но он не будет применять его.

Вы не можете предоставить экземпляр из INI-файла. Автор проверяет, установлено ли свойство _db при попытке записи, и выдает исключение, когда оно пустое. Но вы указали строку для свойства, поэтому _db не равно NULL и не выдаст. Вместо этого при попытке записи ваш писатель выдаст $this->_db->insert(), что приведет к ошибке, поскольку _db должен быть пропущенным Zend_Db_Adapter, но является строкой, например, не объект.

Подробнее см. Метод factory () и _write ():

0 голосов
/ 14 декабря 2012

Я использовал этот бутстрап:

protected function _initLog()
{
    $options = $this->getOption('resources');
    $db = Zend_Registry::get('db');
    $options['log']['db']['writerParams']['db'] = $db;

    $logOptions = $options['log'];
    $logger = Zend_Log::factory($logOptions);
    $logger->addPriority('DBLOG', 9);
    Zend_Registry::set('logger', $logger);
}

Затем вы можете использовать application.ini для других настроек:

resources.log.db.writerName = "Db"
;resources.log.db.writerParams.adapter = <<this must be a database connection, configured in bootstrap>>
resources.log.db.writerParams.table = "users_logs"
resources.log.db.writerParams.columnMap.id  = "id"
resources.log.db.writerParams.columnMap.created  = "created"
resources.log.db.filterName = "Priority"
resources.log.db.filterParams.priority = 9
resources.log.db.filterParams.operator = "=="
...