89 lines
2.6 KiB
PHP
89 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Lib;
|
|
|
|
use Throwable;
|
|
|
|
class Exceptions
|
|
{
|
|
/**
|
|
* Anonymize at least Sql queries
|
|
*
|
|
* @param string $message
|
|
* @return string
|
|
*/
|
|
public static function getAnonymizedMessage(string $message): string
|
|
{
|
|
$message = \preg_replace('/^(.*)( \(SQL:.*\))$/', '$1', $message) ?? $message;
|
|
return $message;
|
|
}
|
|
|
|
/**
|
|
* Anonymize stack trace
|
|
*
|
|
* @param \Exception $e
|
|
* @return string
|
|
*/
|
|
public static function getAnonymizedStackTrace(Throwable $e): string
|
|
{
|
|
$projectPath = \realpath(\sprintf('%s/../', \app_path()));
|
|
$traceStack = $e->getTrace();
|
|
$traceStr = '';
|
|
$maxStackStage = 0;
|
|
foreach ($traceStack as $stackStage => $stack) {
|
|
$maxStackStage = $stackStage;
|
|
$traceStr .= \sprintf(
|
|
'#%s %s(%d): ',
|
|
$stackStage,
|
|
str_replace($projectPath, '', $stack['file'] ?? ''),
|
|
$stack['line'] ?? ''
|
|
);
|
|
if (isset($stack['class'])) {
|
|
$traceStr .= "{$stack['class']}->{$stack['function']}(";
|
|
if (isset($stack['args'])) {
|
|
$traceStr .= self::handleArgs($stack);
|
|
}
|
|
$traceStr .= ")\n";
|
|
} elseif (isset($stack['function'])) {
|
|
$traceStr .= "{$stack['function']}(";
|
|
if (isset($stack['args'])) {
|
|
$traceStr .= self::handleArgs($stack);
|
|
}
|
|
$traceStr .= ")\n";
|
|
}
|
|
}
|
|
$maxStackStage++;
|
|
$traceStr .= "#$maxStackStage {main}";
|
|
return $traceStr;
|
|
}
|
|
|
|
/**
|
|
* Handle Args
|
|
*
|
|
* @param array $stack
|
|
* @return string
|
|
*/
|
|
public static function handleArgs(array $stack): string
|
|
{
|
|
$traceArgs = '';
|
|
$argsCount = count($stack['args']);
|
|
for ($i = 0; $i < $argsCount; $i++) {
|
|
$type = \gettype($stack['args'][$i]);
|
|
switch ($type) {
|
|
case 'object':
|
|
$traceArgs .= sprintf('Object(%s)', \get_class($stack['args'][$i]));
|
|
break;
|
|
case 'array':
|
|
$traceArgs .= sprintf('Array(%d)', \count($stack['args'][$i]));
|
|
break;
|
|
case 'string':
|
|
$traceArgs .= sprintf('String(%d)', \strlen($stack['args'][$i]));
|
|
break;
|
|
default:
|
|
$traceArgs .= \gettype($stack['args'][$i]);
|
|
}
|
|
$traceArgs .= ($i !== ($argsCount - 1) ? ',' : '');
|
|
}
|
|
return $traceArgs;
|
|
}
|
|
}
|