【问题标题】:Zend Framework -> Zend_Log via application.ini => insert() on a non-object errorZend Framework -> Zend_Log via application.ini => insert() 非对象错误
【发布时间】:2010-03-20 22:18:08
【问题描述】:

我正在尝试通过 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

【问题讨论】:

    标签: zend-framework zend-log


    【解决方案1】:

    我在这里提交了一个修复: http://framework.zend.com/issues/browse/ZF-9497

    【讨论】:

      【解决方案2】:

      您还不能从 Ini 配置中实例化数据库记录器。

      要么在 _initLog 方法中的 Bootstrap 中设置 Logger,要么扩展常规 Zend_Log 类以使用默认 DB 适配器或更好地实例化 application.ini 中给出的 DB 适配器。

      看这里:


      如果您对为什么它在 application.ini 中不起作用感兴趣:

      Log Resource Plugin 会调用Zend_Log::factory 方法,它会依次检查你定义的Writer,然后调用这个Writer 的factory 方法来创建一个新的Writer 实例。但是Zend_Log_Writer_Db 期望它的构造函数的第一个参数是Zend_Db_Adapter 实例,但它不会强制执行它。

      您无法从 ini 文件中提供实例。当您尝试写入时,编写器将检查是否设置了 _db 属性,并在它为空时抛出异常。但是您为该属性提供了一个字符串,因此 _db 不为 null 并且不会抛出。相反,当你试图写你的作家时会$this->_db->insert(),导致错误,因为_db应该是缺少的Zend_Db_Adapter,但是是一个字符串,例如一个非对象。

      详见 factory() 和 _write() 方法:

      【讨论】:

        【解决方案3】:

        我使用了这个引导程序:

        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 = "=="
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多