Я боролся с проблемой в течение нескольких дней, но до сих пор не понимаю, что с ней не так.
Вот мой сегмент конфигурации в application.config.php:
// Initial configuration with which to seed the ServiceManager. // Should be compatible with Zend\ServiceManager\Config. 'service_manager' => array( 'abstract_factories' => array( 'Zend\Log\LoggerAbstractServiceFactory', 'Zend\Cache\Service\StorageCacheAbstractServiceFactory', ) ), 'log' => array( 'Log\App' => 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: Zend\ServiceManager\Exception\ServiceNotFoundException File: /var/openresty/html/skeleton-zf2/vendor/zendframework/zendframework/library/Zend/ServiceManager/ServiceManager.php:529 Message: Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Log\App
обновлено Спасибо за помощь ocramius
Перемещаю сегмент на module.config.php, и на этот раз он исключил исключение:
Zend\ServiceManager\Exception\ServiceNotCreatedException 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: Application\Web).
Как обсуждалось в IRC, проблемы здесь были 2:
config/application.config.php
(который не является модульной / объединенной конфигурацией, а тем, что вводится в эксплуатацию "ApplicationConfig"
) try { // ... $logger = $this->getServiceLocator()->get('Log\\App'); // ... } catch (\Exception $e) { do { var_dump($e->getMessage()); } while ($e = $e->getPrevious()); }
Скорее всего, ваша конфигурация имеет неправильный путь для файла, к которому должен обращаться журнал записи, и это будет происходить путем отслеживания этих исключений, как я только что показал.