Console - yii2開發控制檯應用時的還我漂漂拳

阿北哥ya發表於2018-02-24

之所以放到此專欄主要是該文章對我們學習yii2-queue有很大幫助。

我們經常使用yii2開發命令列應用,也會遇到比如讓使用者在命令列輸入資訊、選擇等操作,今天為大家介紹的這個yii2的Console類輕鬆的幫你搞定這件事情,有了它,你的命令列應用將更加高逼格。

為了學習更簡單,我們用問答的形式開始。

Console在哪裡?

Console是yii2的一個幫助類,所在資料夾為 /vendor/yiisoft/yii2/helpers,裡面有 BaseConsoleConsole ,Console類繼承於BaseConsole,BaseConsole不允許被呼叫,因此我們都是使用Console類。

在程式碼裡要使用套路

use yii\helpers\Console;
...
Console::xxxx()
複製程式碼

Hello World

當我們開發yii2的控制檯應用的時候,可以echo一個字串,這樣命令列會顯示,那麼用Console如何實現那?看程式碼

public function actionIndex() {
    Console::output(“Hello World”);
}
複製程式碼

對,用Console::output,你可能會說,“這還沒有echo簡單那?”,那麼我們接著看。

五彩繽紛的Hello World

我現在想讓Hello是黃色的,World是綠色的,怎麼玩?

public function actionIndex() {
  $hello = Console::ansiFormat("Hello",[Console::FG_YELLOW]);
  $world = Console::ansiFormat("World",[Console::FG_GREEN]);
  Console::output("{$hello} {$world}");
}
複製程式碼

Console::ansiFormat可以為字串增加更多樣式。

Snipaste_2018-02-24_19-53-29.png

關鍵在於ansiFormat的第二個引數,這是一個陣列,除了能傳遞FG_開頭的前景色,還能傳遞BG_開頭的背景色,也就是說我們不但能改變字型的顏色,還能加背景,比如接下來的這行程式碼

$hello = Console::ansiFormat("Hello",[Console::FG_YELLOW,Console::BG_BLUE]);
複製程式碼

看圖說話

Snipaste_2018-02-24_20-04-46.png

那麼Console一共支援多少種前景色和背景色那?

  • 前景色 FG_BLACK / FG_RED / FG_GREEN / FG_YELLOW / FG_BLUE / FG_PURPLE / FG_CYAN / FG_GREY
  • 背景色 BG_BLACK / BG_RED / BG_GREEN / BG_YELLOW / BG_BLUE / BG_PURPLE / BG_CYAN / BG_GREY

哥,內容能加粗麼?

必須的了,你以為就是顏色麼?下面把其他樣式再說下,比如加粗、斜體等等,看程式碼

Console::output(Console::ansiFormat("normal",[Console::NORMAL]));
Console::output(Console::ansiFormat("bold",[Console::BOLD]));
Console::output(Console::ansiFormat("italic",[Console::ITALIC]));
Console::output(Console::ansiFormat("underline",[Console::UNDERLINE]));
Console::output(Console::ansiFormat("negative",[Console::NEGATIVE]));
複製程式碼

如果你的英文不達標可以看效果圖

Snipaste_2018-02-24_20-21-12.png

我想得到使用者輸入的

沒錯,這是一個程式最基本的功能,Console當然也可以,就像下面的程式,我們讓使用者輸入名字,然後再輸出。

$name = Console::input("請輸入你的名字:");

$formatName = Console::ansiFormat($name,[Console::FG_YELLOW]);
Console::output("你的名字是:{$formatName}");
複製程式碼

Console::input,還能新增提示語,看看結果是不是很有趣。

Snipaste_2018-02-24_20-27-56.png

使用者寫太危險,我要他選擇。

你說的有道理,你是要使用者進行單選題是吧,比如性別等。

$sex = Console::select("性別:",[1=>'男',2=>'女']);

$formatSex = Console::ansiFormat($sex,[Console::FG_YELLOW]);
Console::output("你的性別是:{$formatSex}");
複製程式碼

Console::select 施展著小魔法

Snipaste_2018-02-24_20-34-18.png

YES OR NO

讓你選擇yes還是no,這種情況在我們使用命令列安裝東西的時候經常遇到,用yii2的Console如何實現這樣的需求那?只需要一個 Console::confirm 方法。

if (Console::confirm("Are you sure?")) {
    Console::output("user input yes");
}else{
    Console::output("user input no");
}
複製程式碼

哇哦,邏輯判斷又出來了,Console幫你實現著計算機軟體的邏輯。

Snipaste_2018-02-24_20-45-14.png

聰明的你一定發現了吧,如果你不輸入直接回車則在上面的程式碼中表示你選擇了no,具體是yes還是no取決於confirm的第二個引數是true還是false。

還有更你x的麼?

那就說一個,上面我們說了使用者輸入是不靠譜的,因此Console也提供了一個驗證方法,看程式碼

Console::prompt("你的名字",['required'=>true,'error'=>'必須輸入']);
複製程式碼

prompt很像yii2中ar的rules方法,對每個輸入進行驗證,通過才能繼續下面的程式碼,比如上面的程式碼是說必須填寫,否則丟擲錯誤資訊並讓你繼續輸入

Snipaste_2018-02-24_20-52-31.png

關於prompt方法主要是第二個引數進行限制,這是一個陣列型別的引數,裡面的值為

  • required 真假,是否必須填寫
  • default 預設值
  • pattern 正則匹配
  • validator 自定義驗證函式
  • error 錯誤資訊

夠強大的了吧。

最後一個巨牛逼的

為了亮瞎你的眼,我覺得先上效果圖

Snipaste_2018-02-24_21-02-08.png

帥氣吧,你在linux系統上應該不止一次看到它吧,用Console也可以輕鬆實現

Console::startProgress(0, 1000);
for ($n = 1; $n <= 1000; $n++) {
    usleep(1000);
    Console::updateProgress($n, 1000);

}
Console::endProgress();
複製程式碼

startProgress、updateProgress、endProgress。

三個你一眼可以看懂的函式就可以搞定,具體什麼時候使用,發揮你強大的想象力吧。

小結

多麼有趣的Console類,當然其實還有很多小方法,比如清空命令列,螢幕尺寸、字串長度等等,總之你的控制檯離不開它。

阿北的知識分享 https://nai8.me

相關文章