Laravel 的 Ray 桌面调试
发布日期 作者 Eric L. Barnes
Ray 是一款适用于 MacOS、Windows 和 Linux 的美观、轻量级桌面应用程序,可帮助您更快地调试 Laravel 应用程序。 与将 dump 语句发送到浏览器不同,您可以将它们发送到 Ray,在那里我们可以以美观的方式显示它们。
在这个简短的演示中,您可以看到它在行动。
您现在可以下载 免费演示版! 在撰写本文时,您可以以 30% 的折扣购买完整许可证。
使用 Ray
要开始在 Laravel 中使用 Ray,您只需安装这个小包。
composer require spatie/laravel-ray
之后,您可以将任何您想发送到 Ray 的内容发送到 Ray。 这是一个例子。
这是一个例子
ray('my first debug statement');
这是它在 Ray 中的样子
您会看到,在发送到 Ray 的字符串下方,您会看到一个链接,指向执行 ray
语句的位置。 点击该链接将带您到 IDE 中的该位置(我们支持 PhpStorm、VScode、Sublime 和许多其他 IDE…)。
ray
函数接受所有内容:字符串、数组、对象……您也可以传递任意数量的参数。
ray('a string', ['a' => 1, 'b' => 2 , 'c' => 3], app());
大型数组和大型对象数组的片段可以折叠,就像您习惯的那样。 在这张截图中,我折叠了 Illuminate\Foundation\Application
的大型实例。
当您调试中等规模的问题时,您过去可能使用过多个 dump 语句。 其中一些语句可能比其他语句更重要。 在过去,我通过用大写字母编写 dump 语句或添加一些额外的字符来区分更重要和不太重要的语句,这样它就能在输出日志中吸引我的眼球。 就像这样
dump('I AM HERE');dump('-------- I AM HERE --------');
与其使用大写字母或其他技巧来突出显示调试信息,不如将您发送到 Ray 的语句着色。
ray('this is green')->green();ray('this is orange')->orange();ray('this is red')->red();ray('this is blue')->blue();ray('this is purple')->purple();ray('this is gray')->gray();
看到 UI 顶部的那些小彩色点了吗? 您可以使用它们来过滤掉具有该颜色的项目。 以下是激活蓝色过滤器后的样子
您是否认为 Ray 对您的眼睛来说太亮了? 您会很高兴知道现在也有一个深色主题。 这就是它看起来的样子。
快速衡量性能
您可能想知道某段代码运行需要多长时间以及它占用了多少内存。 您可以通过调用 ray()->measure()
来轻松衡量性能。 第一次调用它时,Ray 将开始测量性能。 第二次调用 measure()
时,它将显示第二次调用和第一次调用之间的时间量。
这是一个例子
ray()->measure(); sleep(1); ray()->measure(); sleep(2); ray()->measure();
这是它在 Ray 中的样子
暂停代码执行
此功能有点令人难以置信:Ray 可以暂停您的代码。 当您想查看代码的副作用(写入数据库的内容、执行的 API 调用)然后再继续时,这将非常有用。
在这个例子中,我们将循环遍历每个用户,以某种方式更改该用户,并暂停代码。
User::each(function(User $user) { $user->performSomeSortOfUpdateOrSideEffect(); ray("Executed loop for user {$user->id}")->pause();})
在您检查数据库确认一切正常后,您可以按 Ray 中的“继续”按钮来执行下一个用户的代码。 如果您想停止执行,请按“停止”按钮,让您的应用程序抛出异常。
查看函数在哪里被调用
有时您想知道您的代码在哪里被调用。 您可以通过使用 caller
函数来快速确定这一点。
ray()->caller();
如果要查看整个回溯,请使用 trace
方法
ray()->trace();
显示模型
如果dump
Eloquent 模型,您会看到该模型的许多内部结构,而这些内部结构您大部分都不需要。
在大多数情况下,您想查看属性和/或加载的关系。 调用 model()
可以做到这一点。
ray()->model($user);
显示所有查询
您可以通过调用 ray()->showQueries();
将代码执行的所有查询发送到 Ray。
ray()->showQueries();
在 Ray 中,我们将显示已执行的查询,并内联所有参数。 您还会看到执行查询所需的时间。 Ray 甚至会向您显示查询执行的位置。 您可以点击该链接跳转到查询的来源。
如果在代码中的某个特定点之后,您不想再发送任何查询,则可以调用 ray()->stopShowingQueries()
。
或者,您可以将闭包传递给 showQueries
,以仅显示在给定可调用对象中执行的查询。
ray()->showQueries(function() { // some code that executes queries});
显示日志项(和可邮件项!)
默认情况下,发送到日志中的任何内容都将在 Ray 中显示。
// these are automatically sent to RayLog::info('using the facade to log something');info('using the helper function to log something');
在一个新的 Laravel 应用程序中,您发送的任何邮件都将写入日志文件(因为日志驱动程序是默认的邮件驱动程序)。 这里有一个很酷的功能:每当 Ray 检测到邮件被写入日志时,它将显示该可邮件项。
// sending any mail when the log mailer is active,// will render that mail-in Ray.
这就是它的样子
显示集合
在 Laravel 应用程序中,Ray 将自动注册一个 ray
集合宏,以便轻松地将集合发送到 Ray。
collect(['a', 'b', 'c']) ->ray('original collection') // displays the original collection ->map(fn(string $letter) => strtoupper($letter)) ->ray('uppercased collection') // displays the modified collection
在 Blade 视图中使用 Ray
您可以使用 @ray
指令从 Blade 视图内部轻松地将变量发送到 Ray。 您可以传递任意数量的内容。
{{-- inside a view --}} @ray($variable, $anotherVariables)
显示事件
您可以通过调用 showEvents
来显示执行的所有事件。
ray()->showEvents(); event(new TestEvent()); event(new TestEventWithParameter('my argument'));
要停止显示事件,请调用 stopShowingEvents
。
ray()->showEvents(); event(new MyEvent()); // this event will be displayed ray()->stopShowingEvents(); event(new MyOtherEvent()); // this event won't be displayed.
或者,您可以将可调用对象传递给 showEvents
。 只有在该可调用对象内部触发的事件才会在 Ray 中显示。
event(new MyEvent()); // this event won't be displayed. ray()->showEvents(function() { event(new MyEvent()); // this event will be displayed.}); event(new MyEvent()); // this event won't be displayed.
总结
Ray 的演示版 允许您在每个会话中将十个项目发送到 Ray。 要在每个会话中发送更多内容,您可以 购买许可证。 在撰写本文时,我们正在进行一项很棒的促销活动,让您可以省下一些钱。