spatie / backtrace
更好的回溯
Requires
- php: ^7.3|^8.0
Requires (Dev)
- ext-json: *
- laravel/serializable-closure: ^1.3
- phpunit/phpunit: ^9.3
- spatie/phpunit-snapshot-assertions: ^4.2
- symfony/var-dumper: ^5.1
README
要在PHP中获取回溯,您可以使用 debug_backtrace
函数。默认情况下,这可能很难处理。报告的框架函数名有偏差:它属于上一个框架。此外,需要使用位掩码传递选项。
此包提供了一种比 debug_backtrace
更好的方法来处理回溯。以下是一个示例
// returns an array with `Spatie\Backtrace\Frame` instances $frames = Spatie\Backtrace\Backtrace::create()->frames(); $firstFrame = $frames[0]; $firstFrame->file; // returns the file name $firstFrame->lineNumber; // returns the line number $firstFrame->class; // returns the class name
支持我们
我们在创建一流的开放源代码包上投入了大量资源。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从家乡寄给我们明信片,注明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们在我们的虚拟明信片墙上发布所有收到的明信片。
安装
您可以通过composer安装此包
composer require spatie/backtrace
用法
这样您就可以创建一个回溯实例
$backtrace = Spatie\Backtrace\Backtrace::create();
获取框架
要获取所有框架,您可以调用 frames
。
$frames = $backtrace->frames(); // contains an array with `Spatie\Backtrace\Frame` instances
Spatie\Backtrace\Frame
具有以下属性
file
:文件的名称lineNumber
:行号arguments
:用于此框架的参数。如果未使用withArguments
,则为null
。class
:此框架的类名。如果框架涉及函数,则为null
。method
:在此框架中使用的函数applicationFrame
:如果此框架属于您的应用程序,则包含true
,如果属于供应商目录中的文件,则包含false
。
收集参数
出于性能原因,回溯的框架将不会包含被调用函数的参数。如果要将这些参数添加进去,请使用 withArguments
方法。
$backtrace = Spatie\Backtrace\Backtrace::create()->withArguments();
减少参数
为了查看目的,参数可以减少为字符串
$backtrace = Spatie\Backtrace\Backtrace::create()->withArguments()->reduceArguments();
默认情况下,一些典型类型将减少为字符串。您可以通过实现一个 ArgumentReducer
来为每种类型定义自己的减少算法
class DateTimeWithOtherFormatArgumentReducer implements ArgumentReducer { public function execute($argument): ReducedArgumentContract { if (! $argument instanceof DateTimeInterface) { return UnReducedArgument::create(); } return new ReducedArgument( $argument->format('d/m/y H:i'), get_class($argument), ); } }
这是内置参数减少器的副本,用于 DateTimeInterface
,我们已更新了格式。当参数不是预期类型时,返回 UnReducedArgument
对象。返回带有参数减少值和参数原始类型的 ReducedArgument
对象。
减少器可以这样使用
$backtrace = Spatie\Backtrace\Backtrace::create()->withArguments()->reduceArguments( Spatie\Backtrace\Arguments\ArgumentReducers::default([ new DateTimeWithOtherFormatArgumentReducer() ]) );
这将首先执行新的减少器,然后是默认的减少器。
设置应用程序路径
您可以使用 applicationPath
来传递应用程序的基本路径。此值将用于确定框架是应用程序框架还是供应商框架。以下是一个使用Laravel特定函数的示例。
$backtrace = Spatie\Backtrace\Backtrace::create()->applicationPath(base_path());
获取跟踪的某个部分
如果您只想获取从回溯中的特定框架开始的框架,可以使用 startingFromFrame
方法
use Spatie\Backtrace\Backtrace; use Spatie\Backtrace\Frame; $frames = Backtrace::create() ->startingFromFrame(function (Frame $frame) { return $frame->class === MyClass::class; }) ->frames();
使用此代码,将过滤掉涉及 MyClass
的框架之前的所有框架。
或者,您可以使用offset
方法,这将跳过指定的帧数。在这个例子中,前两帧不会出现在$frames
中。
$frames = Spatie\Backtrace\Backtrace::create() ->offset(2) ->frames();
限制帧数
要获取特定数量的帧,请使用limit
函数。在这个例子中,我们只会获取前两帧。
$frames = Spatie\Backtrace\Backtrace::create() ->limit(2) ->frames();
获取可抛出的堆栈跟踪
以下是获取可抛出堆栈跟踪的方法。
$frames = Spatie\Backtrace\Backtrace::createForThrowable($throwable)
因为我们将使用可抛出中已存在的堆栈跟踪,所以帧将始终包含使用的参数。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关如何报告安全漏洞,请参阅我们的安全策略。
鸣谢
许可协议
MIT许可协议(MIT)。有关更多信息,请参阅许可文件。