Пример #1
0
 public function onBootstrap(MvcEvent $e)
 {
     $serviceManager = $e->getApplication()->getServiceManager();
     $application = $e->getApplication();
     $eventManager = $application->getEventManager();
     $eventManager->attach(MvcEvent::EVENT_DISPATCH, function ($event) use($serviceManager) {
         $serviceManager = ServiceLocatorFactory::getInstance()->getServiceLocator();
         $action = $event->getRouteMatch()->getParam('action');
         $action = $action . "Action";
         if (!method_exists($event->getTarget(), $action)) {
             $url = $event->getRequest()->getUri()->getPath();
             $errorInfo = new EventLogger($serviceManager);
             $errorInfo->set_event_type(EventType::ROUTER_NOT_MATCH);
             $trace = debug_backtrace();
             array_shift($trace);
             $errorMessage = 'The requested controller ' . $event->getRouteMatch()->getParam('controller') . ' was unable to dispatch the request';
             $errorInfo->handle(Application::ERROR_CONTROLLER_CANNOT_DISPATCH, $errorMessage, null, null, $trace, null, $url);
         }
     });
     $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, function ($event) use($serviceManager) {
         $exception = $event->getResult()->exception;
         if ($exception instanceof \Exception) {
             $errorInfo = new EventLogger($serviceManager);
             $errorInfo->set_event_type(EventType::EXCEPTION_DISPATCH);
             $errorInfo->handle($exception);
             die;
         }
         $error = $event->getError();
         $url = $event->getRequest()->getUri()->getPath();
         $errorMessage = "";
         if ($error == Application::ERROR_CONTROLLER_NOT_FOUND) {
             $errorMessage = 'The requested controller ' . $event->getRouteMatch()->getParam('controller') . ' could not be mapped to an existing controller class';
         }
         if ($error == Application::ERROR_CONTROLLER_INVALID) {
             $errorMessage = 'The requested controller ' . $event->getRouteMatch()->getParam('controller') . ' is not dispatchable';
         }
         if ($error == Application::ERROR_ROUTER_NO_MATCH) {
             $errorMessage = 'The requested URL could not be matched by routing';
         }
         if ($error == Application::ERROR_CONTROLLER_NOT_FOUND || $error == Application::ERROR_CONTROLLER_INVALID || $error == Application::ERROR_ROUTER_NO_MATCH) {
             $trace = debug_backtrace();
             array_shift($trace);
             $errorInfo = new EventLogger($serviceManager);
             $errorInfo->set_event_type(EventType::ROUTER_NOT_MATCH);
             $errorInfo->handle($error, $errorMessage, null, null, $trace, null, $url);
         }
     });
     $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, function ($event) use($serviceManager) {
         $exception = $event->getResult()->exception;
         if ($exception instanceof \Exception) {
             $errorInfo = new EventLogger($serviceManager);
             $errorInfo->set_event_type(EventType::EXCEPTION_RENDER);
             $errorInfo->handle($exception);
             die;
         }
     });
     $factory = ServiceLocatorFactory::getInstance();
     $factory->setServiceLocator($serviceManager);
 }
Пример #2
0
 public function handle()
 {
     $args = func_get_arg(0);
     $serviceManager = ServiceLocatorFactory::getInstance()->getServiceLocator();
     $config = $serviceManager->get('config');
     $headers = $serviceManager->get('request')->getHeaders();
     $this->_customConfig = $config["GTErrorTracker"];
     $this->_customConfig['errorCodeResponse'] = $this->_customConfig['errorCodeResponse'] ? $this->_customConfig['errorCodeResponse'] : self::ERROR_CODE_RESPONSE;
     $this->_customConfig['secondsPreventErrorRecursion'] = $this->_customConfig['secondsPreventErrorRecursion'] ? $this->_customConfig['secondsPreventErrorRecursion'] : self::SECONDS_PREVENT_ERROR_RECURSION;
     $this->_headerSignKey = $headers->get('Signkey');
     $this->_headerToken = $headers->get('Token');
     if ($args instanceof \Exception) {
         $this->_f_event_file = $args->getFile();
         $this->_f_message = $args->getMessage();
         $this->_f_line = $args->getLine();
         $this->_f_event_code = "Exception:" . $args->getCode();
         $this->_f_stack_trace = $this->stackTraceProcessing($args->getTrace(), $args->getMessage());
         if (isset($args->xdebug_message)) {
             $this->_f_xdebug_message = $args->xdebug_message;
         }
     } else {
         //Arguments Order
         //$errno, $errstr, $errfile, $errline, $trace
         $args = func_get_args();
         $errno = $args[0];
         $errstr = $args[1];
         $this->_f_event_file = $args[2];
         $this->_f_line = $args[3];
         $trace = $args[4];
         // trace array
         $errcontext = $args[5];
         // variables value near error
         $route = isset($args[6]) ? $args[6] : null;
         //wrong route on 404 page
         $type = "Undefined";
         switch ($errno) {
             case E_ERROR:
                 $type = "E_ERROR";
                 break;
             case E_WARNING:
                 $type = "E_WARNING";
                 break;
             case E_PARSE:
                 $type = "E_PARSE";
                 break;
             case E_NOTICE:
                 $type = "E_NOTICE";
                 break;
             case E_CORE_ERROR:
                 $type = "E_CORE_ERROR";
                 break;
             case E_CORE_WARNING:
                 $type = "E_CORE_WARNING";
                 break;
             case E_COMPILE_ERROR:
                 $type = "E_COMPILE_ERROR";
                 break;
             case E_COMPILE_WARNING:
                 $type = "E_COMPILE_WARNING";
                 break;
             case E_USER_ERROR:
                 $type = "E_USER_ERROR";
                 break;
             case E_USER_WARNING:
                 $type = "E_USER_WARNING";
                 break;
             case E_USER_NOTICE:
                 $type = "E_USER_NOTICE";
                 break;
             case E_STRICT:
                 $type = "E_STRICT";
                 break;
             case E_RECOVERABLE_ERROR:
                 $type = "E_RECOVERABLE_ERROR";
                 break;
             case E_DEPRECATED:
                 $type = "E_DEPRECATED";
                 break;
             case E_USER_DEPRECATED:
                 $type = "E_USER_DEPRECATED";
                 break;
             case Application::ERROR_CONTROLLER_NOT_FOUND:
                 $type = "ERROR_CONTROLLER_NOT_FOUND";
                 break;
             case Application::ERROR_CONTROLLER_INVALID:
                 $type = "ERROR_CONTROLLER_INVALID";
                 break;
             case Application::ERROR_ROUTER_NO_MATCH:
                 $type = "ERROR_ROUTER_NO_MATCH";
                 break;
             case Application::ERROR_CONTROLLER_CANNOT_DISPATCH:
                 $type = "ERROR_CONTROLLER_CANNOT_DISPATCH";
                 break;
         }
         $this->_f_event_code = $type;
         if ($this->_f_event_type == EventType::ROUTER_NOT_MATCH) {
             $this->_f_message = "{$errstr} at route: {$route}";
         } else {
             $this->_f_message = "Backtrace from {$this->_f_event_code} {$errstr} at {$this->_f_event_file} {$this->_f_line} ";
         }
         $this->_f_stack_trace = $this->stackTraceProcessing($trace, $this->_f_message);
     }
     $remote = new RemoteAddress();
     $this->_f_ip_address = $remote->getIpAddress();
     $hasGTCurrentUser = ServiceLocatorFactory::getInstance()->getServiceLocator()->has('gt_current_user');
     if ($hasGTCurrentUser) {
         $user = ServiceLocatorFactory::getInstance()->getServiceLocator()->get('gt_current_user');
         if ($user instanceof GTUserInterface) {
             $this->_f_user_id = $user->getId();
         }
     }
     $event_hash = $this->getHash();
     $session = new Container('user');
     if ($session->eventHash == $event_hash) {
         if ($this->_f_date_time - $session->errorTime < $this->_customConfig['secondsPreventErrorRecursion']) {
             $this->echoIfDevMode($session->lastEventId);
         } else {
             $session->errorTime = $this->_f_date_time;
             // save time when error has been occurred
             $this->redirectIfDevMode($session->lastEventId);
         }
     } else {
         $this->_f_event_hash = $event_hash;
         if ($this->_customConfig["GTErrorTypesSaveToDb"][H\EventType::getName($this->_f_event_type)]) {
             $this->save();
             $session->eventHash = $event_hash;
             // save new Hash to session
             $session->lastEventId = $this->_f_event_logger_id;
             // save new ID to session
             $session->errorTime = $this->_f_date_time;
             // save time when error has been occurred
             $this->redirectIfDevMode($session->lastEventId);
         }
     }
 }
Пример #3
0
function process_error_backtrace($errno, $errstr, $errfile, $errline, $errcontext)
{
    $sm = ServiceLocatorFactory::getInstance()->getServiceLocator();
    $customEvent = new EventLogger($sm);
    switch ($errno) {
        case E_ERROR:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
        case E_WARNING:
            $errorDangerLevel = EventType::WARNING_PHP;
            break;
        case E_PARSE:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
        case E_NOTICE:
            $errorDangerLevel = EventType::NOTICE_PHP;
            break;
        case E_CORE_ERROR:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
        case E_CORE_WARNING:
            $errorDangerLevel = EventType::WARNING_PHP;
            break;
        case E_COMPILE_ERROR:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
        case E_COMPILE_WARNING:
            $errorDangerLevel = EventType::WARNING_PHP;
            break;
        case E_USER_ERROR:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
        case E_USER_WARNING:
            $errorDangerLevel = EventType::WARNING_PHP;
            break;
        case E_USER_NOTICE:
            $errorDangerLevel = EventType::NOTICE_PHP;
            break;
        case E_STRICT:
            $errorDangerLevel = EventType::WARNING_PHP;
            break;
        case E_RECOVERABLE_ERROR:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
        case E_DEPRECATED:
            $errorDangerLevel = EventType::NOTICE_PHP;
            break;
        case E_USER_DEPRECATED:
            $errorDangerLevel = EventType::NOTICE_PHP;
            break;
        default:
            $errorDangerLevel = EventType::ERROR_PHP;
            break;
    }
    $customEvent->set_event_type($errorDangerLevel);
    $trace = debug_backtrace();
    array_shift($trace);
    $customEvent->handle($errno, $errstr, $errfile, $errline, $trace, $errcontext);
    if ($errorDangerLevel == EventType::ERROR_PHP) {
        die;
    }
}