setFormatter($formatter); $handlers[] = $rotatingFileHandler; $mailRecipientAddr = self::DEFAULT_ERROR_EXCEPTION_MAIL_RECIPIENT_ADDRESS; if ($mailRecipientAddr !== '' && filter_var($mailRecipientAddr,FILTER_VALIDATE_EMAIL)) { $handlers[] = self::getDefaultMailHandler($mailSubject,$mailFromAddr,self::DEFAULT_ERROR_EXCEPTION_MAIL_RECIPIENT_ADDRESS,self::DEFAULT_ERROR_EXCEPTION_MAIL_RECIPIENT_NAME); } $logger = new Logger($loggerName,$handlers); return $logger; } /** * @param $subject * @param $fromAddr * @param $toAddr * @param $toName * @return SwiftMailerHandler */ private static function getDefaultMailHandler($subject, $fromAddr, $toAddr, $toName) { $smtpTransporter = \Swift_SmtpTransport::newInstance(); $mailer = \Swift_Mailer::newInstance($smtpTransporter); $msg = \Swift_Message::newInstance($subject); $msg->addFrom($fromAddr); $msg->addTo($toAddr, $toName); $mailFormatter = new HtmlFormatter(); $mailHandler = new SwiftMailerHandler($mailer, $msg); $mailHandler->setFormatter($mailFormatter); return $mailHandler; } /** * @param $exception */ public static function handleException($exception) { $logger = self::getDefaultExceptionLogger(); $msg = 'An unhandled exception occurred! ' . PHP_EOL . " Errno: {$exception->getCode()}" . PHP_EOL . " Msg: {$exception->getMessage()}" . PHP_EOL; $fileName = $exception->getFile(); if ($fileName !== '') { $msg .= " File: $fileName " . PHP_EOL; } $lineNo = $exception->getLine(); if ($lineNo !== 0) { $msg .= " Line: $lineNo" . PHP_EOL; } $traceString = str_replace("\n",PHP_EOL,$exception->getTraceAsString()); if ($traceString !== '') { $msg .= " Trace: $traceString" . PHP_EOL; } $msg .= PHP_EOL; $logger->addError($msg); self::doConditionalRedirect(self::$redirectExceptionPath,self::$redirectExceptionMsg); } /** * @param $errno * @param $errstr * @param string $errfileName * @param null $errLine * @param array|null $errContext */ public static function handleError($errno, $errstr, $errfileName = '', $errLine = null, array $errContext = null) { $logger = self::getDefaultErrorLogger(); $msg = 'An error occurred!' . PHP_EOL . " Errno: $errno" . PHP_EOL . " Msg: $errstr" . PHP_EOL; if ($errfileName !== '') { $msg .= " File: $errfileName" . PHP_EOL; } if ($errLine !== null) { $msg .= " Line: $errLine" . PHP_EOL; } if ($errContext !== null && count($errContext) > 0) { $msg .= ' Context Variables: ' . print_r($errContext,1) . PHP_EOL; } $msg .= PHP_EOL; $logger->addError($msg); self::doConditionalRedirect(self::$redirectErrorPath,self::$redirectErrorMsg); } /** * @param string $redirectToPagePath * @param string $redirectWithMessage */ public static function setExceptionHandler($redirectToPagePath = '', $redirectWithMessage = '') { if (!self::$isSetAsExceptionHandler) { self::$redirectExceptionPath = $redirectToPagePath; self::$redirectExceptionMsg = $redirectWithMessage; $callable = array(__CLASS__,'handleException'); set_exception_handler($callable); } } /** * @param string $redirectToPagePath * @param string $redirectWithMessage */ public static function setErrorHandler($redirectToPagePath = '', $redirectWithMessage = '') { if (!self::$isSetAsErrorHandler) { self::$redirectErrorPath = $redirectToPagePath; self::$redirectErrorMsg = $redirectWithMessage; $callable = array(__CLASS__,'handleError'); set_error_handler($callable,self::getErrorHandlingLevel()); } } /** * @return int */ private static function getErrorHandlingLevel() { return E_ALL^E_NOTICE^E_STRICT^E_WARNING; } /** * @param string $path * @param string $msg */ private static function doConditionalRedirect($path = '', $msg = '') { if ($path !== '' && !self::isPathCurrentUrl($path)) { self::saveErrorFlashMessageToSession($msg); universal_redirect($path); } } /** * @param string $msg */ private static function saveErrorFlashMessageToSession($msg = '') { static $i = null; if ($msg !== '') { $errorMsgs = isset($_SESSION['msgBag']['errors']) ? $_SESSION['msgBag']['errors'] : []; if (!in_array($msg,$errorMsgs,true)) { $errorMsgs[] = $msg; } $_SESSION['msgBag']['errors'] = $errorMsgs; } } /** * @param string $path * @return bool */ private static function isPathCurrentUrl($path = '') { $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $domainName = $_SERVER['HTTP_HOST']; $request = $_SERVER['REQUEST_URI']; $currPath = $protocol.$domainName.$request; return $path === $currPath; } }