3分鐘短文:膽兒真肥!Laravel在命令列問使用者要資料!

程式設計師小助手發表於2020-10-27

引言

上一章我教會大家如何在3分鐘的時間,通過laravel躋身geek之列(聽一下就好[捂嘴.jpg])。實現了一個簡單的命令列,和一個複雜的傳送郵件通知的功能。

可是細心的讀者你發現了沒有,使用自定義的命令列,全程我們沒有輸入一個引數,沒有一個資料,這,這,這,太不尋常了吧

img

linux下的命令,沒有一個是不帶引數自己玩兒的!所以本文教你改造命令列,做一個標準的應用程式。

事前詢問

首先我們要區分獲取引數的兩種方式,一種是在輸入命令列時直接給定的,還有一種是在程式執行過程中,等待使用者輸入資訊之後才能繼續。

先說第一種方式,也分為兩種,一種叫引數 argument,一種叫選項 option。在laravel程式裡,這兩個名字沒有變化。

比如,有一個密碼重置的命令列工具,要求傳入一個 userId 用於標記使用者的身份,在類的宣告中指明使用方式:

protected $signature = 'password:reset {userId}';

假設上述類已經完成功能開發,在命令列中呼叫:

php artisan password:reset 5

在程式碼中使用 $this->argument() 方法,列印其結果是一個陣列,內容如下:

[
    "command": "password:reset",
    "userId': "5",
]

如果要返回指定的引數值,只需傳入鍵名即可:

$this->argument('userId'); // 5

返回的就是命令列上傳送的引數。這個 {userId} 的寫法就是 argument,稱為 引數

還有一種方式是選項 option,宣告的時候,要在方法內這樣寫:

protected $signature = 'password:reset {--userId=}';

這就是宣告一個選項了,使用命令列的時候資料傳送方式也不一樣:

php artisan password:reset --userId=5

程式裡要用 $this->option() 來獲取,列印陣列內容如下:

[
    "userId" => "5"
    "help" => false
    "quiet" => false
    "verbose" => false
    "version" => false
    "ansi" => false
    "no-ansi" => false
    "no-interaction" => false
    "env" => null
]

比 argument 列印的內容豐富的多,為什麼?因為那些事laravel Command 類預設追加上的,只要繼承了基類都天然自帶這些選項。

用法類似,獲取單個的選項值,只要傳入鍵名就可以了:

$this->option('userId');

為了演示兩個方法的用法,我們為命令列呼叫方式宣告兩種獲取引數的方式:

protected $signature = 'password:reset {userId : user ID} {--sendEmail : Send email or NOT}';

在程式裡我們要分別獲取,下面是手動實現 handle 處理方法:

public function handle()
{
    // 所有引數
    $arguments = $this->argument();
    $userid = $this->argument('userId');

    // 所有選項
    $options = $this->option();
    $sendEmail = $this->option('sendEmail');
}

事中確認

有些引數是要在程式執行中對使用者進行詢問,下面就介紹幾個常用的方法。

ask方法需要使用者輸入字串內容:

$email = $this->ask('What is your email address?');

如果輸入的是密碼敏感資料,預設是不能展示在終端的,使用 secret方法:

$password = $this->secret('What is the password?');

有時候是詢問使用者是或者否,那就用 confirm方法:

if ($this->confirm('Do you want to reset the password?')) {
//
}

還有一些,儘量減少使用者輸入,使用選項的方式,讓使用者選,這樣輸入的採集資料基本不會出錯。使用 choice方法:

$level = $this->choice('What is the level?', ['low', 'middle', 'high'], 0);

有這幾個助陣,基本上夠用了,做一個有些複雜的中型的命令列工具,只要PHP還執行的動,處理的來,基本沒啥問題。

寫在最後

本文我們講述了兩個重要的概念,引數和選項。在設計命令列的時候一定要想清楚,規劃好,到底用哪一個,在程式碼中才能有的放矢地讀取。並且使用詢問等待可以製作更多靈活的引導型程式,非常實用。

Happy coding :-)

我是@程式設計師小助手,專注程式設計知識,圈子動態的IT領域原創作者

本作品採用《CC 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章