diff --git a/README.md b/README.md index 2eefa9b..2991c8d 100644 --- a/README.md +++ b/README.md @@ -24,3 +24,6 @@ ### [RegExpFactory](https://github.com/alexpts/php-tools/blob/master/docs/regExpFactory.md) Сервис для карирования регулярных выражений + +### [TraceFormatter](https://github.com/alexpts/php-tools/blob/master/docs/traceFormatter.md) +Сервис для форматирования трейса в компактный вид для логов diff --git a/composer.json b/composer.json index 068afb5..9d23278 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,8 @@ }], "minimum-stability": "stable", "require": { - "php": "~8.0" + "php": "~8.0", + "ext-mbstring": "*" }, "require-dev": { "phpunit/phpunit": "~9.4" diff --git a/composer.lock b/composer.lock index dfba99f..c37f178 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e9b35da88bcc0326fb15315673cc78db", + "content-hash": "9487d1f7f69f912ca460523175ee58a7", "packages": [], "packages-dev": [ { @@ -2100,7 +2100,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "~8.0" + "php": "~8.0", + "ext-mbstring": "*" }, "platform-dev": [], "plugin-api-version": "2.0.0" diff --git a/docs/traceFormatter.md b/docs/traceFormatter.md new file mode 100644 index 0000000..68bbb53 --- /dev/null +++ b/docs/traceFormatter.md @@ -0,0 +1,12 @@ +### TraceFormatter + +Преобразует массив трейсов в компактный формат для логов, позволяет вырезать префикс из трейсов для усменьшения размеров + +```php +use PTS\Tools\TraceFormatter; + +$projectDir = dirname(__DIR__, 2); +$formatter = new TraceFormatter($projectDir); +$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); +$compactTrace = $formatter->formatTrace($trace); +``` diff --git a/src/TraceFormatter.php b/src/TraceFormatter.php new file mode 100644 index 0000000..f8c6aa0 --- /dev/null +++ b/src/TraceFormatter.php @@ -0,0 +1,37 @@ +ignoreFilePrefixSize = $path ? mb_strlen($path) + 1 : 0; + } + + /** + * Преобразуем в более компактный вид трейс, для логов + * + * @param array[] $traces + * + * @return string[] + */ + public function formatTrace(array $traces): array + { + return array_map(function(array $t): string { + $file = $this->getFile($t['file'] ?? ''); + return $file . ':' . $t['line'] . ' :: ' . $t['class'] . $t['type'] . $t['function']; + }, $traces); + } + + protected function getFile(string $file): string + { + return $this->ignoreFilePrefixSize + ? './' . mb_substr($file, $this->ignoreFilePrefixSize) + : $file; + } +} \ No newline at end of file diff --git a/test/unit/TraceFormatterTest.php b/test/unit/TraceFormatterTest.php new file mode 100644 index 0000000..d802e85 --- /dev/null +++ b/test/unit/TraceFormatterTest.php @@ -0,0 +1,36 @@ +formatTrace($trace); + + $expected = [ + './vendor/phpunit/phpunit/src/Framework/TestCase.php:1536 :: TraceFormatterTest->testFormatter', + './vendor/phpunit/phpunit/src/Framework/TestCase.php:1142 :: PHPUnit\Framework\TestCase->runTest', + './vendor/phpunit/phpunit/src/Framework/TestResult.php:730 :: PHPUnit\Framework\TestCase->runBare', + './vendor/phpunit/phpunit/src/Framework/TestCase.php:883 :: PHPUnit\Framework\TestResult->run', + './vendor/phpunit/phpunit/src/Framework/TestSuite.php:669 :: PHPUnit\Framework\TestCase->run', + './vendor/phpunit/phpunit/src/Framework/TestSuite.php:669 :: PHPUnit\Framework\TestSuite->run', + './vendor/phpunit/phpunit/src/Framework/TestSuite.php:669 :: PHPUnit\Framework\TestSuite->run', + './vendor/phpunit/phpunit/src/TextUI/TestRunner.php:667 :: PHPUnit\Framework\TestSuite->run', + './vendor/phpunit/phpunit/src/TextUI/Command.php:148 :: PHPUnit\TextUI\TestRunner->run', + './vendor/phpunit/phpunit/src/TextUI/Command.php:101 :: PHPUnit\TextUI\Command->run', + './vendor/phpunit/phpunit/phpunit:61 :: PHPUnit\TextUI\Command::main', + ]; + + static::assertSame($expected, $actual); + } + +}