了解 Laravel Tinker Shell
发布时间 作者 Paul Redmond
Laravel 包含一个强大的 REPL,称为 Tinker,由 Justin Hileman 开发的 PsySH 控制台提供支持。Tinker 控制台允许您在交互式 shell 中通过命令行与 Laravel 应用程序进行交互。
Tinker 曾经是 laravel/framework
包的一部分,但随着 Laravel 5.4 的发布,它被提取到 单独的包中。
什么是 REPL?
REPL 代表 Read—Eval—Print—Loop,它是一种交互式 shell,接收单个用户输入,对其进行评估,并将结果返回给用户。我第一次通过 rails 控制台了解交互式控制台的概念,它是 Ruby on Rails 框架的一部分。其他语言,如 Ruby,配备了 REPL作为语言特性。交互式 shell 是尝试语言和框架的好方法。
PHP 有一个交互式 shell,您可以通过运行 php -a
来使用它(由 @lcjury 指出),但 PsySH 有更多功能,因此我将其用于 PHP 的通用交互式 shell 和 Laravel 应用程序的 Tinker。
在 Laravel 之外使用 PsySH
我强烈建议您全局安装 psysh 包。您可以使用 composer 通过运行以下命令安装 psysh
命令
composer global require psy/psysh:@stable
确保您的全局 composer bin/ 在您的路径中,以便您可以从任何地方运行 psysh
export PATH="~/.composer/vendor/bin:$PATH"
要启动交互式会话,请运行 psysh
命令。以下是内置 show
命令的示例,该命令可以向您显示命令的源代码
$ psyshPsy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman>>> show array_key_existsfunction array_key_exists($key, $search)Source code unavailable.
help
命令是您的朋友,因此您可以查看 PsySH 的内置功能
>>> help help ls dump doc show ...
我已经删除了帮助命令的描述,但您明白了。
您甚至可以 下载 PHP 核心文档作为 CLI 伴侣,当您需要参考函数的工作方式时
$ mkdir -p ~/.local/share/psysh/$ wget -O \ ~/.local/share/psysh/php_manual.sqlite http://psysh.org/manual/en/php_manual.sqlite
安装了 PHP 手册后,您可以阅读文档,然后在 CLI 中尝试它
$ psyshPsy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman>>> doc array_key_existspsyshPsy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman>>> doc array_key_existsfunction array_key_exists($key, $search) Description: Checks if the given key or index exists in the array array_key_exists() returns TRUE if the given $key is set in the array. $key can be any value possible for an array index.... >>> array_key_exists('car', ['bike' => 'BMX']);=> false
我一直使用 PsySH 来验证内置 PHP 函数的工作方式,并以交互方式玩转 PHP。我过去没有使用 REPL,而是创建了一个 index.php 文件,并使用 PHP 命令运行它来验证语言特性。下次您这样做时,尝试使用 PsySH!仅 history
命令就值得使用 REPL,这样您就可以回忆以前的命令。
Laravel Tinker:增强版 PsySH
就像我之前提到的,“tinker” 命令位于普通 PsySH 之上。将 Tinker 视为尝试 Laravel 应用程序的最佳方式之一。让我们看一下一些应该使用 Laravel 增强您的开发工作流程的不错功能。
文档命令
doc
命令是查找有关函数或方法文档的强大方法。例如,假设您想查找 request()
辅助函数的工作方式
$ php artisan tinker>>> doc requestfunction request($key = null, $default = null) Description: Get an instance of the current request or an input item from the request. Param: array|string $key mixed $default Return: \Illuminate\Http\Request|string|array
或者也许我想查看 request()
代码
>>> show request > 633| function request($key = null, $default = null) 634| { 635| if (is_null($key)) { 636| return app('request'); 637| } 638| 639| if (is_array($key)) { 640| return app('request')->only($key); 641| } 642| 643| return data_get(app('request')->all(), $key, $default); 644| }
Tinker Shell 中的 Artisan 命令
当您运行 php artisan tinker
时,该命令会启动一个交互式 PsySH shell,其中 Laravel 已引导。在运行 shell 之前,tinker
命令会将命令添加到 shell 中。这些命令在 TinkerCommand 类的 $commandWhitelist
属性中定义。
protected $commandWhitelist = [ 'clear-compiled', 'down', 'env', 'inspire', 'migrate', 'optimize', 'up',];
从这个列表中,您可以看到可以运行 up
和 down
来切换维护模式。您还可以运行 migrate
来执行任何待处理的迁移。最后,您可以运行 clear-compiled
来清除已编译的类文件。
测试 Laravel 代码
Tinker 最有用的部分之一,是能够玩转 Laravel 代码,例如模型和服务。您可以使用控制台创建一个新的模型,例如
$ php artisan tinker>>> use App\User;>>> $user = new User(['name' => 'John','email' => '[email protected]']);$user->password = bcrypt('example');=> "$2y$10$2l1vIXYJy.Q5otmdaaNG5./l4jbxpYYlhrSipZAsJRwAuuzjsSXlq"$user->save();=> true$user->toArray();=> [ "name" => "John", "email" => "[email protected]", "updated_at" => "2017-09-12 06:37:13", "created_at" => "2017-09-12 06:37:13", "id" => 1, ]
这是我在 Tinker 会话中最喜欢的与数据库相关的命令,谦逊的 factory()
辅助函数用于创建测试用户
$ php artisan tinker>>> use App\User;>>> factory(User::class, 5)->create();...
以下是如何查询 User 模型以从 users
表中获取十个结果
$php artisan tinker>>> use App\User;>>> User::limit(10)->get();=> Illuminate\Database\Eloquent\Collection {#1071 all: [ App\User {#1072 id: 1, publisher_id: null, name: "John", email: "[email protected]", created_at: "2017-09-12 06:37:13", updated_at: "2017-09-12 06:37:13", }, ], }>>>
Tinker 是触发手动作业和尝试服务、作业和事件等事物的理想场所。例如,这里我们从容器中获取日志服务并写入日志
$ php artisan tinker>>> $log = app('log');=> Illuminate\Log\Writer {#1042}>>> $log->info('test');=> null
了解更多
找到更多信息的最佳方法是深入 Tinker 会话并使用 help
命令,如果您忘记了可以运行的命令。官方 psysh 文档是熟悉底层交互式 shell 的绝佳资源。交互式调试器功能和 wtf
命令是一些您应该检查的功能。如果您想了解有关 Tinker 工作原理的更多信息,请查看 GitHub 上的 laravel/tinker 包。
**编辑 2017 年 9 月 12 日:**@lcjury 指出 PHP 确实包含一个交互式 shell,可以通过从命令行运行 php -a
来运行。