了解 Laravel Tinker Shell

发布时间 作者

Getting to Know the Laravel Tinker Shell image

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 命令的示例,该命令可以向您显示命令的源代码

$ psysh
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> show array_key_exists
function 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 中尝试它

$ psysh
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> doc array_key_exists
psysh
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> doc array_key_exists
function 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 request
function 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',
];

从这个列表中,您可以看到可以运行 updown 来切换维护模式。您还可以运行 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",
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 来运行。

Paul Redmond photo

Laravel 新闻的编外作者。全栈 Web 开发人员和作者。

归档于
Cube

Laravel 新闻稿

加入 40,000 多名其他开发者,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成功能和对本地和生产环境的即时反馈进行 Tinker。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron,两位来自 No Compromises 播客的资深开发者,现已开放接受您的 Laravel 项目的聘用。 ⬧ 固定月薪 $7500。 ⬧ 无冗长的销售流程。 ⬧ 无合同。 ⬧ 100% 退款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行老旧的 Laravel 版本?即时、自动化的 Laravel 升级和代码现代化,让您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

只需每月 $2500,即可为您的项目配备一位拥有 4-6 年经验的资深 Laravel 开发者。获得 160 小时的专属专业知识和 15 天无风险试用。立即安排电话会议!

Bacancy
Lucky Media logo

Lucky Media

现在就选择 Lucky - Laravel 开发的理想之选,拥有超过十年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar: Laravel 电子商务

Laravel 的电子商务解决方案。一个开源软件包,将现代无头电子商务功能的力量带到 Laravel。

Lunar: Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 职位发布平台

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS 启动套件

SaaSykit 是一个 Laravel SaaS 启动套件,包含运行现代 SaaS 所需的所有功能。支付、精美结账、管理面板、用户仪表板、身份验证、即用型组件、统计信息、博客、文档等等。

SaaSykit: Laravel SaaS 启动套件
Rector logo

Rector

您无缝 Laravel 升级的合作伙伴,降低成本,加速创新,助力企业成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发者能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。探索 MongoDB 灵活、现代的数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel Prompts 构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包为您的 Laravel 应用程序添加评论

阅读文章