我们的Zend_Log只通过向application.ini添加以下行来初始化
resources.log.stream.writerName = "Stream"
resources.log.stream.writerParams.mode = "a"
所以Zend_Application_Resource_Log将为我们创建实例。
我们已经能够通过以下方式在控制器中访问此实例:
public function getLog()
{
$bootstrap = $this->getInvokeArg('bootstrap');
//if (is_null($bootstrap)) return false;
if (!$bootstrap->hasPluginResource('Log')) {
return false;
}
$log = $bootstrap->getResource('Log');
return $log;
}
到目前为止,非常好。
现在我们想在模型类中使用相同的日志实例,我们无法访问引导程序。
我们的第一个想法是在Zend_Registry中注册相同的Log实例,以便能够在任何地方使用Zend_Registry :: get('Zend_Log'):
在我们的Bootstrap类中:
protected function _initLog() {
if (!$this->hasPluginResource('Log')) {
throw new Zend_Exception('Log not enabled');
}
$log = $this->getResource('Log');
assert( $log != null);
Zend_Registry::set('Zend_Log', $log);
}
不幸的是,这个断言失败==> $ log IS NULL ---但为什么??
很明显,我们可以在引导期间手动初始化Zend_Log而不使用Zend_Application_Resource_Log的自动化,因此不会接受这种答案。
答案 0 :(得分:3)
这是最终的解决方案。我们基本上不应该调用函数_initLog()
非常感谢ArneRie!
// Do not call this function _initLog() !
protected function _initRegisterLogger() {
$this->bootstrap('Log');
if (!$this->hasPluginResource('Log')) {
throw new Zend_Exception('Log not enabled in config.ini');
}
$logger = $this->getResource('Log');
assert($logger != null);
Zend_Registry::set('Zend_Log', $logger);
}
答案 1 :(得分:2)
此时可能没有引导,请尝试:
try {
$this->bootstrap('log'); // bootstrap log
$logger = $this->getResource('log');
} catch (Zend_Application_Bootstrap_Exception $e) {
$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Null();
$logger->addWriter($writer);
}
$registry = Zend_Registry::set('logger', $logger);