瞭解 Laravel Tinker Shell

轉載自:https://juejin.im/entry/5a4ef7be518825734978b612/

本文翻譯整理自 Getting to Know the Laravel Tinker Shell

Laravel 包含一個強大的 REPL,稱爲 tinker,由 Justin Hileman 編寫的 PsySH 控制檯驅動。tinker 允許您從交互式 shell 中的命令行與 Laravel 應用程序進行交互。

tinker 曾經是 laravel/framework 軟件包的一部分,但隨着 Laravel 5.4 的發佈被提取到獨立的軟件包中。

什麼是REPL?

REPL 是 Read Eval Print Loop 的縮寫,它是一種交互式 shell,它接受單個用戶輸入,運行它們,並將結果返回給用戶。我最先是通過 Rails 控制檯 瞭解了一個交互式控制檯的概念,這個控制檯是 Ruby on Rails 框架的一部分。其他語言,比如 Ruby ,配備了 REPL 作爲語言功能。交互式 shell 是用語言和框架進行實驗的好方法。

PHP 有一個可以運行的交互式 shell:php -a,但是由於 PsySH 具有更多的特性,所以我將它用於 PHP 的一般交互式 shell 和 Laravel 應用程序的 tinker。

在Laravel 之外使用 PsySH

我強烈建議您全局安裝 psysh 軟件包。您可以通過 運行以下命令全局安裝 psysh:

composer global require psy/psysh:@stable

確保你的 Composer 包在你的 bin/ 目錄下,這樣你可以從任何地方運行 PsySH:

export PATH="~/.composer/vendor/bin:$PATH"

要啓動交互式會話,請運行 psysh 命令。下面是一個內置 show 命令的例子,它可以顯示一個命令的源代碼:

$ psysh
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> show array_key_exists
function array_key_exists($key, $search)
Source code unavailable.

help 命令是您的朋友,以便您可以看到 PsySH 內置的功能:

>>> help
  help
  ls         
  dump       
  doc        
  show       
  ...

我已經刪除了幫助命令的描述,但我覺得你應該能看明白這些命令的作用。

當需要引用函數的工作方式時,甚至可以將 PHP 核心文檔 作爲 CLI 協同服務器下載:

$ mkdir -p ~/.local/share/psysh/
$ wget -O \
  ~/.local/share/psysh/php_manual.sqlite
  http://psysh.org/manual/en/php_manual.sqlite

安裝 PHP 手冊後,您可以閱讀文檔,然後在 CLI 中嘗試:

$ psysh
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> doc array_key_exists
psysh
Psy Shell v0.8.11 (PHP 7.1.5 — cli) by Justin Hileman
>>> doc array_key_exists
function array_key_exists($key, $search)

Description:
  Checks if the given key or index exists in the array

  array_key_exists() returns TRUE if the given $key
  is set in the array. $key can be any value
  possible for an array index.
...

>>> array_key_exists('car', ['bike' => 'BMX']);
=> false

我一直使用 PsySH 來查看內置的 PHP 函數是如何工作的,並以交互的方式使用 PHP 進行測試。我用來創建一個 index.php 文件,並用 PHP 命令運行它來驗證語言特性,而不是使用 REPL。下一次你這樣做,請嘗試使用 PsySH!history 單獨的命令值得使用 REPL,你可以調用以前的命令。

Laravel Tinker: PsySH on Steroids

就像我之前提到的那樣,tinker 基於 PsySH。將 tinker 程序視爲試用 Laravel 的最佳方法之一。讓我們來看看幾個不錯的功能,這些功能應該可以使您的開發工作流程與 Laravel 相提並論。

文檔命令

該doc命令是查找有關函數或方法的文檔的有效方法。例如,假設您想查看 request() 幫助函數的工作方式:

$ php artisan tinker
>>> doc request
function request($key = null, $default = null)

Description:
  Get an instance of the current request or an input item from the request.

Param:
  array|string  $key
  mixed         $default

Return:
  \Illuminate\Http\Request|string|array

或者,也許我想看到的是 request() 的代碼:

>>> show request
  > 633|     function request($key = null, $default = null)
    634|     {
    635|         if (is_null($key)) {
    636|             return app('request');
    637|         }
    638|
    639|         if (is_array($key)) {
    640|             return app('request')->only($key);
    641|         }
    642|
    643|         return data_get(app('request')->all(), $key, $default);
    644|     }

在 Tinker 中使用 Artisan 命令

運行 php artisan tinker,該命令將會啓動 Laravel 引導的交互式 PsySH shell。在運行 shell 之前,tinker 會將將一些 Artisan 命令添加到 shell。這些命令在 TinkerCommand 類的 $commandWhitelist 屬性 中被定義。

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

從這個列表中,您可以看到可以運行 updown 切換維護模式。您也可以運行 migrate 以執行任何未執行的遷移。最後,你可以運行 clear-compiled 清除編譯後的類文件。

測試 Laravel 代碼

這可能 Tinker 最有用的部分之一,就是能夠使用 Laravel 的代碼,比如 ModelServices。您可以使用控制檯創建一個新的 Model,例如:

$ php artisan tinker
>>> use App\User;
>>> $user = new User([
'name' => 'John',
'email' => '[email protected]'
]);
$user->password = bcrypt('example');
=> "$2y$10$2l1vIXYJy.Q5otmdaaNG5./l4jbxpYYlhrSipZAsJRwAuuzjsSXlq"
$user->save();
=> true
$user->toArray();
=> [
     "name" => "John",
     "email" => "[email protected]",
     "updated_at" => "2017-09-12 06:37:13",
     "created_at" => "2017-09-12 06:37:13",
     "id" => 1,
   ]

這是我在 tinker 的數據庫相關的命令中最喜歡的一個用法,使用 factory() 幫助函數來創建測試用戶:

$ php artisan tinker
>>> use App\User;
>>> factory(User::class, 5)->create();
...

以下是如何查詢用戶模型以從users表中返回十個結果:

$php artisan tinker
>>> use App\User;
>>> User::limit(10)->get();
=> Illuminate\Database\Eloquent\Collection {#1071
     all: [
       App\User {#1072
         id: 1,
         publisher_id: null,
         name: "John",
         email: "[email protected]",
         created_at: "2017-09-12 06:37:13",
         updated_at: "2017-09-12 06:37:13",
       },
        ],
    }
>>>

tinker 是觸發 jobs 工作和嘗試諸如 servicesjobsevents 之類的好地方。例如,在這裏,我們從容器中獲取日誌服務並寫入日誌:

$ php artisan tinker
>>> $log = app('log');
=> Illuminate\Log\Writer {#1042}
>>> $log->info('test');
=> null

學到更多

找出更多的最好方法是進入 Tinker 會話,並使用 help 命令,如果你忘記了你可以運行的命令。官方 psysh 文檔 是熟悉底層交互式 shell 的極好資源。交互式調試器功能和 wtf 命令是你應該查看的一些功能。如果您想了解更多關於 tinker 的工作原理,請參閱GitHub上的 laravel/tinker

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章