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

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

由 学院君 创建于2年前, 最后更新于 1年前

版本号 #1

9508 views

4 likes

0 collects

REPL 与 PsySH

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

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

a247c30096cef35d6165abd70f04b39f.png

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

composer g require psy/psysh:@stable

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

d62b36f8d83abc5ffb06d855f87e9235.png

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

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

Laravel Tinker 使用

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

查看帮助文档

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

4d7a1ea3d97de9238208c23793ccdc32.png

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

69a363223bb98018d3be35a703c0c3d1.png

是不是很方便?当然,仅限于函数查看,类方法虽然支持,但是还是通过 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 中直接运行这些命令:

8ee270ba2df55788f23092243d36034d.png

测试 Laravel 代码

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

ac31c13dec957bd297a4783488af061a.png

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

9474109931377cf111414d52c14f9d32.png

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

d7317a278d07265fc594ae8136b93541.png

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

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

了解更多

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用Tkinter的`pack_forget()`和`pack()`方法来实现窗口跳转。您可以先将当前窗口隐藏,然后显示下一个窗口。例如,下面的代码演示了如何在Tkinter中实现两个窗口之间的跳转: ```python import tkinter as tk class Window1(tk.Frame): def __init__(self, master): super().__init__(master) self.pack() self.label = tk.Label(self, text="This is Window 1") self.label.pack() self.button = tk.Button(self, text="Go to Window 2", command=self.go_to_window2) self.button.pack() def go_to_window2(self): self.pack_forget() # remove current window from display window2 = Window2(self.master) # create new window 2 object window2.pack() # show new window 2 object class Window2(tk.Frame): def __init__(self, master): super().__init__(master) self.pack() self.label = tk.Label(self, text="This is Window 2") self.label.pack() self.button = tk.Button(self, text="Go to Window 1", command=self.go_to_window1) self.button.pack() def go_to_window1(self): self.pack_forget() # remove current window from display window1 = Window1(self.master) # create new window 1 object window1.pack() # show new window 1 object root = tk.Tk() window1 = Window1(root) window1.pack() root.mainloop() ``` 这将创建两个窗口,您可以在它们之间来回切换。 第一个窗口有一个按钮,单击它将显示第二个窗口,第二个窗口也有一个按钮,单击它将返回第一个窗口。使用 `pack_forget()` 和 `pack()` 方法来实现窗口的切换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值