无法在 ZF2 中获取记录器服务



这个问题我折腾了好几天,但还是没找到问题所在。

以下是我在application.config.php中的配置段:
// Initial configuration with which to seed the ServiceManager.
// Should be compatible with ZendServiceManagerConfig.
'service_manager' => array(
    'abstract_factories' => array(
        'ZendLogLoggerAbstractServiceFactory',
        'ZendCacheServiceStorageCacheAbstractServiceFactory',
    )
),
'log' => array(
    'LogApp' => array(
        'writers' => array(
            array(
                'name' => 'stream',
                'priority' => 1000,
                'options' => array(
                    'stream' => 'data/logs/app.log'
                )
            )
        )
    )
)

,我尝试在我的控制器中获取服务实例:

$logger = $this->getServiceLocator()->get('Log\App');

和抛出异常:

An error occurred
An error occurred during execution; please try again later.
Additional information:
ZendServiceManagerExceptionServiceNotFoundException
File:
/var/openresty/html/skeleton-zf2/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529
Message:
ZendServiceManagerServiceManager::get was unable to fetch or create an instance for LogApp

感谢您的帮助ocramius

我将段移动到module.config.php,这次它抛出了异常:

ZendServiceManagerExceptionServiceNotCreatedException
File:
/var/openresty/html/skeleton-zf2/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:1070
Message:
An abstract factory could not create an instance of applicationweb(alias: ApplicationWeb).

在IRC上讨论过,这里的问题有两个:

  • 您拥有此配置的文件是config/application.config.php(这是不是模块/合并配置,而是将其放入服务"ApplicationConfig")
  • 由于异常,抽象工厂无法实例化服务。为了调试异常,您可以执行如下操作:
try {
    // ...
    $logger = $this->getServiceLocator()->get('Log\App');
    // ...
} catch (Exception $e) {
    do {
        var_dump($e->getMessage());
    } while ($e = $e->getPrevious());
}

最有可能的是,您的配置有一个错误的文件路径,必须由日志编写者访问,这将通过跟踪这些异常出现,就像我刚才展示的那样。

最新更新