通过 Tinker 实现 Laravel 命令行交互式 Shell


REPL 与 PsySH

Laravel 自带了一个功能强大的 REPL —— Tinker,所谓 REPL,是 Read–Eval–Print-Loop 的缩写,这是一种交互式 Shell:获取用户输入并执行它们,然后将结果打印出来返回给用户。

在原生 PHP 中,我们也可以使用类似的交互式 Shell,通过 php -a 命令即可:

此外,还可以通过 PsySH 实现,相较于原生的 php -a,PsySH 拥有更多高级特性,因此功能更加强大。在使用 PsySH 之前,需要通过 Composer 全局安装:

composer g require psy/psysh:@stable

然后就可以在命令行执行 psysh 进入交互式 Shell 了(确保全局 Composer 的 bin 目录在系统路径中),在 PsySH 中我们能编写各种代码,打印语句、计算表达式、编写函数等等:

甚至还支持基于 XDebug 进行代码调试、与系统 Shell 集成等等,更多使用方法可以参考官方文档

Laravel Tinker 就是基于 PsySH 实现的,与 Artisan 主要用于编写和执行 Artisan 命令不同,通过 Tinker,我们可以在命令行中实现与 Laravel 应用的各种交互,包括数据库的增删改查。

Laravel Tinker 使用

下面我们一起来看一下如何通过 Tinker 赋能本地 Laravel 开发。在命令行中通过 php artisan tinker 即可进入 Laravel Tinker 的交互式 Shell。

查看帮助文档

在 Laravel Tinker 中,doc 命令可用于查看某个函数或方法的帮助文档,例如,我们想查看辅助函数 config() 如何使用,可以这么做:

就会将 config() 函数的文档信息打印出来,如果你还想进一步查看该函数的代码,通过 show 命令来实现:

是不是很方便?当然,仅限于函数查看,类方法虽然支持,但是还是通过 PHPStorm 的跳转功能快(因为要输入完整的命名空间)。

运行 Artisan 命令

此外,每次我们运行 php artisan tinker 就相当于从控制台启动了 Laravel 应用,在运行交互式命令前,tinker 命令会添加一些命令到 Shell,这些命令定义在 Laravel\Tinker\Console\TinkerCommand$commandWhitelist 属性中:

protected $commandWhitelist = [
    'clear-compiled', 'down', 'env', 'inspire', 'migrate', 'optimize', 'up',
];

因此,你可以在 Tinker Shell 中直接运行这些命令:

测试 Laravel 代码

看完前面两个功能,可能你对 Tinker 还是提不起来兴趣,毕竟都是可以借助其他方式可以快速完成的,甚至效率更高。接下来要介绍的,则是 Tinker 最有用的功能了,我们可以在 Tinker Shell 中演练测试 Laravel 代码。比如模型和服务,你可以使用控制台来创建一个新的模型,将其保存到数据库,然后查询这条记录(如果之前没有运行过 php artisan migrate 命令创建 users 表,先运行 migrate 命令创建):

当然,我们还可以通过工厂方法 factory() 批量创建用户,这在测试的时候很方便,比如说我们随机创建三个用户:

此外,Tinker 还是个手动触发队列任务、体验服务和事件的好地方,例如,下面我们从容器获取一个日志服务并新增一条日志:

打开 storage/logs/laravel.log,就会看到日志已经写进去了:

[2018-11-21 02:13:05] local.INFO: test 

了解更多

这里,我们只是介绍了一些入门级的使用示例,更多好玩的东西有赖于你自己在日常开发中去探索,PsySH 官方文档 有很多资源让你了解 Tinker 的底层,如果你想了解更多关于 Tinker 的内容,可以去 Tinker 的 GitHub 仓库逛逛。


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 在 Laravel 中编写高级的 Artisan 命令

>> 下一篇: 入门篇(一):数据库连接配置和读写分离