Как регистрировать исключения контроллера ZF2
Я регистрирую экземпляр Zend\Log для исключений, в конце концов мне понадобятся все системные ошибки, отправленные по электронной почте, теперь они просто отправляются в файл. Тем не менее, это не работает в контроллерах, исключение отображается в представлении (или нет, в зависимости от display_exceptions
). Я нашел эту ошибку, кажется, никто не заботится об этом. Так что мне нужен обходной путь. Есть ли способ заставить контроллеры не употреблять мои исключения?
'service_manager' => array(
'factories' => array(
'Logger' => function ($sm) use ($sRootDir)
{
$log = new Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream($sRootDir . '/temp/license.log');
$log->addWriter($writer);
Zend\Log\Logger::registerErrorHandler($log);
Zend\Log\Logger::registerExceptionHandler($log);
return $log;
},
),
1 ответ
Вы можете прикрепить к событию ошибки отправки:
Module.php
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
/**
* Log any Uncaught Errors
*/
$sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
$sm = $e->getApplication()->getServiceManager();
$sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
function($e) use ($sm) {
if ($e->getParam('exception')){
$sm->get('Logger')->crit($e->getParam('exception'));
}
}
);
}
Пример конфигурации сервиса для простого регистратора
'factories' => array(
'Logger' => function($sm){
$logger = new \Zend\Log\Logger;
$writer = new \Zend\Log\Writer\Stream('./data/log/'.date('Y-m-d').'-error.log');
$logger->addWriter($writer);
return $logger;
},
// ...
);
Вы также можете регистрировать все исключения в стеке, чтобы лучше понять, что пошло не так, вместо того, чтобы показывать только последнее исключение, которое может не содержать много информации.
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
/**
* Log any Uncaught Exceptions, including all Exceptions in the stack
*/
$sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
$sm = $e->getApplication()->getServiceManager();
$sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
function($e) use ($sm) {
if ($e->getParam('exception')){
$ex = $e->getParam('exception');
do {
$sm->get('Logger')->crit(
sprintf(
"%s:%d %s (%d) [%s]\n",
$ex->getFile(),
$ex->getLine(),
$ex->getMessage(),
$ex->getCode(),
get_class($ex)
)
);
}
while($ex = $ex->getPrevious());
}
}
);
}