. */ /** * Función para enviar mensajes al log de errores * * @param mixed $data * @param bool $printLastCaller */ function debugLog($data, $printLastCaller = false) { $line = date('Y-m-d H:i:s') . ' - ' . print_r($data, true) . PHP_EOL; $useOwn = (!defined('LOG_FILE') || !error_log($line, 3, LOG_FILE) ); if ($useOwn === false) { error_log(print_r($data, true)); } if ($printLastCaller === true) { if ($useOwn === true) { error_log(formatTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)), 3, LOG_FILE); } else { error_log(formatTrace(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS))); } } } /** * Procesar una excepción y registrarla en el log * * @param \Exception $exception */ function processException(\Exception $exception) { debugLog(__($exception->getMessage())); debugLog($exception->getTraceAsString()); $previous = $exception->getPrevious(); if ($previous !== null) { debugLog(__($previous->getMessage())); debugLog($previous->getTraceAsString()); } } /** * @param $trace * @return string */ function formatTrace($trace) { $btLine = []; $i = 0; foreach ($trace as $caller) { $class = isset($caller['class']) ? $caller['class'] : ''; $file = isset($caller['file']) ? $caller['file'] : ''; $line = isset($caller['line']) ? $caller['line'] : 0; $btLine[] = sprintf('Caller %d: %s\%s (%s:%d)', $i, $class, $caller['function'], $file, $line); $i++; } return implode(PHP_EOL, $btLine); } /** * Alias gettext function * * @param string $message * @param bool $translate Si es necesario traducir * @return string */ function __($message, $translate = true) { return $translate === true && $message !== '' && mb_strlen($message) < 4096 ? gettext($message) : $message; } /** * Returns an untranslated string (gettext placeholder) * * @param string $message * @return string */ function __u($message) { return $message; } /** * Alias para obtener las locales de un dominio * * @param string $domain * @param string $message * @param bool $translate * @return string */ function _t($domain, $message, $translate = true) { return $translate === true && $message !== '' && mb_strlen($message) < 4096 ? dgettext($domain, $message) : $message; } /** * Capitalización de cadenas multi byte * * @param $string * @return string */ function mb_ucfirst($string) { return mb_strtoupper(mb_substr($string, 0, 1)); } /** * Devuelve el tiempo actual en coma flotante. * Esta función se utiliza para calcular el tiempo de renderizado con coma flotante * * @param float $from * @returns float con el tiempo actual */ function getElapsedTime($from) { return microtime(true) - (float)$from; } /** * Inicializar módulo * * @param $module */ function initModule($module) { $dir = dir(MODULES_PATH); while (false !== ($entry = $dir->read())) { $moduleFile = MODULES_PATH . DIRECTORY_SEPARATOR . $entry . DIRECTORY_SEPARATOR . 'module.php'; if ($entry === $module && file_exists($moduleFile)) { require $moduleFile; } } $dir->close(); } /** * @param $dir * @param $levels * @return bool|string */ function nDirname($dir, $levels) { if (version_compare(PHP_VERSION, '7.0') === -1) { debugLog(realpath(dirname($dir) . str_repeat('../', $levels))); return realpath(dirname($dir) . str_repeat('../', $levels)); } return dirname($dir, $levels); } /** * @param Exception $exception * @throws ReflectionException */ function flattenExceptionBacktrace(\Exception $exception) { $traceProperty = (new \ReflectionClass('Exception'))->getProperty('trace'); $traceProperty->setAccessible(true); $flatten = function (&$value, $key) { if ($value instanceof \Closure) { $closureReflection = new \ReflectionFunction($value); $value = sprintf( '(Closure at %s:%s)', $closureReflection->getFileName(), $closureReflection->getStartLine() ); } elseif (is_object($value)) { $value = sprintf('object(%s)', get_class($value)); } elseif (is_resource($value)) { $value = sprintf('resource(%s)', get_resource_type($value)); } }; do { $trace = $traceProperty->getValue($exception); foreach ($trace as &$call) { array_walk_recursive($call['args'], $flatten); } $traceProperty->setValue($exception, $trace); } while ($exception = $exception->getPrevious()); $traceProperty->setAccessible(false); } //set_exception_handler('\flattenExceptionBacktrace');