通过 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 仓库逛逛。
4 Comments
学院君,请问这个要在哪里更改呢? Illuminate/Database/QueryException with message 'SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = blog and table_name = migrations and table_type = 'BASE TABLE')'
数据库连接的问题 有运行过
php artisan migrate
吗我运行php artisan migrate也是报一样的错
你是在哪里运行的 数据库创建了吗 连接信息在 .env 中配置正确了吗