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 应用的各种交互,包括数据库的增删改查。
下面我们一起来看一下如何通过 Tinker 赋能本地 Laravel 开发。在命令行中通过 php artisan tinker
即可进入 Laravel Tinker 的交互式 Shell。
在 Laravel Tinker 中,doc
命令可用于查看某个函数或方法的帮助文档,例如,我们想查看辅助函数 config()
如何使用,可以这么做:
就会将 config()
函数的文档信息打印出来,如果你还想进一步查看该函数的代码,通过 show
命令来实现:
是不是很方便?当然,仅限于函数查看,类方法虽然支持,但是还是通过 PHPStorm 的跳转功能快(因为要输入完整的命名空间)。
此外,每次我们运行 php artisan tinker
就相当于从控制台启动了 Laravel 应用,在运行交互式命令前,tinker
命令会添加一些命令到 Shell,这些命令定义在 Laravel\Tinker\Console\TinkerCommand
的 $commandWhitelist
属性中:
protected $commandWhitelist = [
'clear-compiled', 'down', 'env', 'inspire', 'migrate', 'optimize', 'up',
];
因此,你可以在 Tinker Shell 中直接运行这些命令:
看完前面两个功能,可能你对 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 仓库逛逛。
本系列教程首发在学院君网站(xueyuanjun.com),你可以点击页面左下角阅读原文链接查看最新更新的教程。