通過 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 命令即可:
此外,還可以通過 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 倉庫逛逛。