Laravel Tinker 的妙用:深入代码中进行调试,交互的 dd ()
Laravel 的命令行工具被称之为“Artisan”,它有着开箱即用的强大功能。Tinker,通过 php artisan tinker
进入,说它是我最喜欢的Artisan 命令行也不为过。它加速了我的工作流,并且让我以意想不到的方式来与我的应用进行交互。
Tinker是一个REPL(交互式解释器)。REPL给你提供了一个允许你用本地语法(这个例子里是PHP),和你的应用交互的一个命令行样式的提示符环境。它通常用来进行简单的数据库更改和测试新的想法和工作流。
虽然Tinker提供的某些值在你第一眼看上去是简洁的,但它有着被隐藏的却又令人兴奋的开箱即用的特性。让我们进一步探索一些能够增强你的Tinker工作流的道路。
开始之前
在开始之前,了解如何在Laravel中应用Tinker是一个很重要的一点。Tinker是由PsySH开发的PHP扩展包。您可以在其网站或者PsySH Github repo了解有关其功能的更多信息。
自Laravel5.4起,Tinker已作为独立的Composer依赖加入Laravel,您可以在此处进行探索:GitHub - laravel/tinker.
Tinker 基本用法
对我来说,读取和操作应用程序中的模型是最常见的用例。像 Post::all()
这样的命令非常适合浏览数据库的内容,而无需创建“测试”路由和 dd(Post::all())
。MySQL 图形应用界面非常适合直接数据库操作,但缺少在应用程序内部定义的功能,例如访问器和修改器。
在编写代码时,我常常不确定一个特定库或PHP特性的语法。使用 Tinker 可以使得代码调试更加快速,而不用写完代码去傻傻地等待报错,甚至得不到报错!我经常发现自己在做类似 collect(['boots', 'cats', 'boots'])->unique()
的事情来验证 Laravel 收集方法的功能。
更好,更具交互性的 dd()
许多Laravel开发人员使用的常见调试工作流程如下:在代码中的某处插入dd()
(dump and die);刷新页面;重复。这个过程当然可以完成工作,但是它可能是限制性的和重复性的。一种替代解决方案是设置 xDebug,但是如果您要调试从命令行运行的代码(例如在测试中),Tinker 提供了另一种选择:
通过使用特殊代码段替换对 dd()
的调用:eval(\Psy\sh());
,我们将得到 Tinker 提示,将我们直接定位到应用程序执行时的特定地方。这有点像能够暂停时间并且使用了冻结住的环境。实际使用:
专业提示:记住
eval(\Psy\sh());
手动输入是很麻烦的,因此建议您在 IDE 中创建一个代码段。我自己的命名为tinker
。
在文档中快速浏览一下,当我们键入 eval(\Psy\sh())
时实际发生了什么:
eval(\Psy\sh());
// 等同于:
extract(\Psy\Shell::debug(get_defined_vars(), $this));
// 注意 `$ this` 是自动绑定的。
通过eval(\ Psy \ sh())
而不是php artisan tinker
访问Tinker时,您会发现细微的差异。自动完成和对象强制转换是两个值得注意的缺陷功能。 Laravel的对象转换程序告诉PsySh如何很好地渲染Collection
,Model
和Application
对象。
专业提示: Tinker shells 可能会意外地在相互的环境中执行而变得难以理清。如果你尝试
exit
,q
, 或者quit
, 然后发现自己在另外一个 Tinker shell 中, 只需使用ctrl+c
退出当前进程.
加速 Laravel Dusk 工作流程
Laravel Dusk 是 Laravel 的软件包,用于在浏览器中测试应用程序的 UI。它允许您测试 Javascript 行为,否则您将无法使用其他形式进行测试。要了解更多信息,请查看以下文档:Laravel Dusk
浏览器测试的性质使得测试中的调试问题变得很耗时,因为您必须运行长时间的浏览器交互才能发现问题。幸运的是,先前描述的 eval(\Psy\sh());
代码段在浏览器测试中的表现类似。
通过将 eval(\Psy\sh());
放入 Dusk 测试中,您可以实时与浏览器测试进行交互。Dusk 将暂停测试的执行,并将您定位到 Tinker Shell 中,您可以在其中操纵当前打开的浏览器窗口。多么酷啊?看一看:
轻松访问 PHP 文档
Tinker提供了另一个命令,doc
,它是对另一种常见模式的补救措施:
谷歌搜索 PHP 函数 -> 滚动到 W3 schools 链接 -> 点击 PHP.net 链接.
请遵循指南 here 安装 PHP Docs sqlite 文件。现在您可以使用 doc
命令作为常见问题的快速参考,例如函数参数顺序。
doc
命令还提供有关对象,类和方法的运行时文档。这样可以节省对 Laravel 文档的多次访问。
复活节彩蛋:
rtfm
是doc
命令的别名。 😂
您可能不知道很多命令在Tinker中都是可用的:
trace
-打印完整的堆栈跟踪。wtf
-显示最近异常回溯的几行。history
-列出命令历史记录。此外,它还有一些方便的选项,用于搜索历史记录(-grep
)和重复(-replay
)历史记录。whereami
-打印您当前的执行位置(文件和行号)。![Tinker whereami命令]](https://cdn.learnku.com/uploads/images/202...)throw-up
-重新抛出最后抛出的异常。q
,quit
,exit
-关闭Tinker外壳。
可以通过在程序提示框中键入:[command] -help
来解释每个命令 。许多命令都有隐藏的功能和别名,您可以通过-help
选项来发现。尽情探索吧!
专业提示:您还可以在Tinker中执行
namespace
和use
语句:
使用自定义 Tinker
PsySH 通过存储在 〜/ .config/psysh/config.php
中的配置文件支持自定义配置。但是,我个人更喜欢将配置存储在项目中以进行版本控制。幸运的是,PsySH 在环境中还会查找一个变量 PSYSH_CONFIG
来获取配置路径,从而使您可以在任意位置存储一个。
我选择将我的存储在我的 Laravel 应用的根目录中,在composer.json
,package.json
等旁边,并在我的 .env
文件中指定它:
PSYSH_CONFIG=tinker.config.php
请查看 PsySH Configuration Docs,以获取可用配置选项的列表。
这是我的 tinker.config.php
的要点: tinker.config.php · GitHub
在开始时包含PHP文件
php artisan tinker
命令接受可选的文件路径,该文件路径可用于加载有用的配置或在进入 Tinker shell 之前执行特定的逻辑。
例如,如果我在根目录中创建了 bootstrap-tinker.php
文件,则可以运行 php artisan tinker bootstrap-tinker.php
,然后 bootstrap-tinker .php
文件将在我进入 shell 之前运行。在文件中定义的任何变量都将在当前运行的 shell 中可用。
痛点:手动键入App\Models\Post
。
就个人而言,编写 App\Models\Post::create
而不是仅仅编写 Post::create
会带来极大的不便。以下是一些解决方法:
namespace App\Models
将允许您在没有完整命名空间的情况下编写Post
。这是不理想的,因为每次重新启动修补程序时,都必须重新输入。- 在启动时包括一个文件(配置文件或自定义包含文件中),该文件定义了一组类别名。例如:
class_alias('App\\Models\\Post','Post');
。唯一的问题是,每次添加新模型时,您都必须手动添加别名。 - 我的首选解决方案是在配置文件中编写一个脚本,该脚本会自动注册模型别名。通过在
app
目录中查找扩展Illuminate\Database\Eloquent\Model.php
的类并为其注册别名来实现。随时访问我的 tinker.config.php 文件以查看我的实现。
附言
- 下次使用
dd()
时,利用 Tinker 的实时/断点调试 (eval(\Psy\sh())
)。 - 运行
doc array_intersect
,而不是谷歌搜索PHP array_intersect
. - 使用自定义的版本控制配置文件来定制工作流程。
Tinker真是太棒了,您应该了解它的所有功能。
玩的开心!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
还是第一次知道可以这么用,黑科技~