之所以放到此專欄主要是該文章對我們學習yii2-queue有很大幫助。
我們經常使用yii2開發命令列應用,也會遇到比如讓使用者在命令列輸入資訊、選擇等操作,今天為大家介紹的這個yii2的Console類輕鬆的幫你搞定這件事情,有了它,你的命令列應用將更加高逼格。
為了學習更簡單,我們用問答的形式開始。
Console在哪裡?
Console是yii2的一個幫助類,所在資料夾為 /vendor/yiisoft/yii2/helpers,裡面有 BaseConsole 和 Console ,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可以為字串增加更多樣式。
關鍵在於ansiFormat的第二個引數,這是一個陣列,除了能傳遞FG_開頭的前景色,還能傳遞BG_開頭的背景色,也就是說我們不但能改變字型的顏色,還能加背景,比如接下來的這行程式碼
$hello = Console::ansiFormat("Hello",[Console::FG_YELLOW,Console::BG_BLUE]);
複製程式碼
看圖說話
那麼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]));
複製程式碼
如果你的英文不達標可以看效果圖
我想得到使用者輸入的
沒錯,這是一個程式最基本的功能,Console當然也可以,就像下面的程式,我們讓使用者輸入名字,然後再輸出。
$name = Console::input("請輸入你的名字:");
$formatName = Console::ansiFormat($name,[Console::FG_YELLOW]);
Console::output("你的名字是:{$formatName}");
複製程式碼
用 Console::input,還能新增提示語,看看結果是不是很有趣。
使用者寫太危險,我要他選擇。
你說的有道理,你是要使用者進行單選題是吧,比如性別等。
$sex = Console::select("性別:",[1=>'男',2=>'女']);
$formatSex = Console::ansiFormat($sex,[Console::FG_YELLOW]);
Console::output("你的性別是:{$formatSex}");
複製程式碼
Console::select 施展著小魔法
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幫你實現著計算機軟體的邏輯。
聰明的你一定發現了吧,如果你不輸入直接回車則在上面的程式碼中表示你選擇了no,具體是yes還是no取決於confirm的第二個引數是true還是false。
還有更你x的麼?
那就說一個,上面我們說了使用者輸入是不靠譜的,因此Console也提供了一個驗證方法,看程式碼
Console::prompt("你的名字",['required'=>true,'error'=>'必須輸入']);
複製程式碼
prompt很像yii2中ar的rules方法,對每個輸入進行驗證,通過才能繼續下面的程式碼,比如上面的程式碼是說必須填寫,否則丟擲錯誤資訊並讓你繼續輸入
關於prompt方法主要是第二個引數進行限制,這是一個陣列型別的引數,裡面的值為
- required 真假,是否必須填寫
- default 預設值
- pattern 正則匹配
- validator 自定義驗證函式
- error 錯誤資訊
夠強大的了吧。
最後一個巨牛逼的
為了亮瞎你的眼,我覺得先上效果圖
帥氣吧,你在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