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 提示,将我们直接定位到应用程序执行时的特定地方。这有点像能够暂停时间并且使用了冻结住的环境。实际使用:

Laravel

专业提示:记住 eval(\Psy\sh()); 手动输入是很麻烦的,因此建议您在 IDE 中创建一个代码段。我自己的命名为 tinker

Tinker Snippet

在文档中快速浏览一下,当我们键入 eval(\Psy\sh()) 时实际发生了什么:

eval(\Psy\sh());
// 等同于:
extract(\Psy\Shell::debug(get_defined_vars(), $this));
// 注意 `$ this` 是自动绑定的。

通过eval(\ Psy \ sh())而不是php artisan tinker访问Tinker时,您会发现细微的差异。自动完成和对象强制转换是两个值得注意的缺陷功能。 Laravel的对象转换程序告诉PsySh如何很好地渲染CollectionModelApplication对象。

Laravel

专业提示: 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 中,您可以在其中操纵当前打开的浏览器窗口。多么酷啊?看一看:

Laravel

轻松访问 PHP 文档

Tinker提供了另一个命令,doc,它是对另一种常见模式的补救措施:

谷歌搜索 PHP 函数 -> 滚动到 W3 schools 链接 -> 点击 PHP.net 链接.

Laravel

请遵循指南 here 安装 PHP Docs sqlite 文件。现在您可以使用 doc 命令作为常见问题的快速参考,例如函数参数顺序。

doc 命令还提供有关对象,类和方法的运行时文档。这样可以节省对 Laravel 文档的多次访问。

Laravel

复活节彩蛋: rtfmdoc 命令的别名。 😂

您可能不知道很多命令在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中执行 namespaceuse 语句:

Tinker名称空间命令

使用自定义 Tinker

PsySH 通过存储在 〜/ .config/psysh/config.php 中的配置文件支持自定义配置。但是,我个人更喜欢将配置存储在项目中以进行版本控制。幸运的是,PsySH 在环境中还会查找一个变量 PSYSH_CONFIG 来获取配置路径,从而使您可以在任意位置存储一个。

我选择将我的存储在我的 Laravel 应用的根目录中,在composer.jsonpackage.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 会带来极大的不便。以下是一些解决方法:

  1. namespace App\Models 将允许您在没有完整命名空间的情况下编写 Post。这是不理想的,因为每次重新启动修补程序时,都必须重新输入。
  2. 在启动时包括一个文件(配置文件或自定义包含文件中),该文件定义了一组类别名。例如:class_alias('App\\Models\\Post','Post');。唯一的问题是,每次添加新模型时,您都必须手动添加别名。
  3. 我的首选解决方案是在配置文件中编写一个脚本,该脚本会自动注册模型别名。通过在app目录中查找扩展Illuminate\Database\Eloquent\Model.php 的类并为其注册别名来实现。随时访问我的 tinker.config.php 文件以查看我的实现。

附言

  • 下次使用 dd() 时,利用 Tinker 的实时/断点调试 (eval(\Psy\sh()))。
  • 运行 doc array_intersect ,而不是谷歌搜索 PHP array_intersect.
  • 使用自定义的版本控制配置文件来定制工作流程。

Tinker真是太棒了,您应该了解它的所有功能。

玩的开心!

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://tighten.co/blog/supercharge-your...

译文地址:https://learnku.com/laravel/t/40956

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 1
Summer

还是第一次知道可以这么用,黑科技~

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!