CodeIgniter4 CLI Library

2020-08-17 18:14 更新

CodeIgniter的CLI庫使創(chuàng)建交互式命令行腳本變得簡單,包括:

  • 提示用戶更多信息
  • 在終端上寫彩色文本
  • Beeping(變得更好?。?/li>
  • 在長任務(wù)中顯示進(jìn)度條
  • 包裝長文本行以適合窗口。

初始化類

您無需創(chuàng)建CLI庫的實(shí)例,因為它的所有方法都是靜態(tài)的。相反,您只需要確保您的控制器可以通過use類上方的一條語句找到它:

<?php namespace App\Controllers;


use CodeIgniter\CLI\CLI;


class MyController extends \CodeIgniter\Controller
{
        . . .
}

首次加載文件時,該類會自動初始化。

從用戶那里獲取輸入

有時您需要詢問用戶更多信息。他們可能沒有提供可選的命令行參數(shù),或者腳本可能遇到了現(xiàn)有文件,需要在覆蓋前進(jìn)行確認(rèn)。這是用prompt()方法處理的。

您可以通過將其作為第一個參數(shù)傳遞來提供問題:

$color = CLI::prompt('What is your favorite color?');

您可以通過在第二個參數(shù)中傳遞默認(rèn)值來提供默認(rèn)答案,如果用戶只是按下Enter鍵,則將使用該默認(rèn)答案:

$color = CLI::prompt('What is your favorite color?', 'blue');

您可以通過傳入允許的答案數(shù)組作為第二個參數(shù)來限制可接受的答案:

$overwrite = CLI::prompt('File exists. Overwrite?', ['y','n']);

最后,您可以將驗證規(guī)則作為第三個參數(shù)傳遞給答案輸入:

$email = CLI::prompt('What is your email?', null, 'required|valid_email');

提供反饋

write()

提供了幾種方法來向用戶提供反饋。這可以像單個狀態(tài)更新一樣簡單,也可以像包裝到用戶終端窗口的復(fù)雜信息表一樣簡單。該write() 方法的核心是將字符串作為第一個參數(shù)輸出的方法:

CLI::write('The rain in Spain falls mainly on the plains.');

您可以通過輸入顏色名稱作為第二個參數(shù)來更改文本的顏色:

CLI::write('File created.', 'green');

這可用于按狀態(tài)區(qū)分消息,或使用其他顏色創(chuàng)建“標(biāo)題”。您甚至可以通過將顏色名稱作為第三個參數(shù)傳遞來設(shè)置背景色:

CLI::write('File overwritten.', 'light_red', 'dark_gray');

可以使用以下前景色:

  • black
  • dark_gray
  • blue
  • dark_blue
  • light_blue
  • green
  • light_green
  • cyan
  • light_cyan
  • red
  • light_red
  • purple
  • light_purple
  • light_yellow
  • yellow
  • light_gray
  • white

較小的數(shù)字可用作背景色:

  • black
  • blue
  • green
  • cyan
  • red
  • yellow
  • light_gray
  • magenta

print()

打印功能與write()方法相同,除了它不會在換行符之前或之后強(qiáng)制換行。而是將其打印到當(dāng)前光標(biāo)所在的屏幕上。這使您可以從不同的呼叫在同一行上打印多個項目。當(dāng)您要顯示狀態(tài),執(zhí)行某些操作然后在同一行上打印“完成”時,這特別有用:

for ($i = 0; $i <= 10; $i++)
{
    CLI::print($i);
}

color()

盡管該write()命令將單行寫入終端,并以EOL字符結(jié)尾,但是您可以使用該color()方法制作可以以相同方式使用的字符串片段,除了在打印后不會強(qiáng)制EOL。這使您可以在同一行上創(chuàng)建多個輸出?;蛘?,更常見的是,可以在write()方法內(nèi)部使用它在內(nèi)部創(chuàng)建其他顏色的字符串:

CLI::write("fileA \t". CLI::color('/path/to/file', 'white'), 'yellow');

本示例將在窗口中寫一行,先以fileA黃色,然后是制表符,然后 /path/to/file是白色文本。

error()

如果需要輸出錯誤,則應(yīng)使用適當(dāng)命名的error()方法。像執(zhí)行操作一樣write(),這會將淺紅色文本寫入STDERR,而不是STDOUT color()。如果您有腳本在監(jiān)視錯誤,這樣它們就不必篩選所有信息,而僅篩選實(shí)際的錯誤消息,這將很有用。您完全按照以下write()方法使用它:

CLI::error('Cannot write to file: ' . $file);

wrap()

該命令將獲取一個字符串,開始在當(dāng)前行上打印它,并在新行上將其包裝為設(shè)置的長度。當(dāng)在您希望在當(dāng)前窗口中顯示而不是離開屏幕的選項列表中顯示說明時,這可能會很有用:

CLI::color("task1\t", 'yellow');
CLI::wrap("Some long description goes here that might be longer than the current window.");

默認(rèn)情況下,字符串將以終端寬度環(huán)繞。Windows當(dāng)前不提供確定窗口大小的方法,因此我們默認(rèn)使用80個字符。如果您想將寬度限制為更短一些,以確??梢酝耆m合窗口,請將最大行長作為第二個參數(shù)傳遞。這將在最接近的單詞障礙處斷開字符串,以便不會損壞單詞。

// Wrap the text at max 20 characters wide
CLI::wrap($description, 20);

您可能會發(fā)現(xiàn)標(biāo)題,文件或任務(wù)的左側(cè)需要一列,而標(biāo)題及其說明的右側(cè)則需要一列文本。默認(rèn)情況下,這將回繞到窗口的左邊緣,這不允許事物按列排列。在這種情況下,您可以傳遞多個空格以填充第一行之后的每一行,以便在左側(cè)留下清晰的列邊緣:

// Determine the maximum length of all titles
// to determine the width of the left column
$maxlen = max(array_map('strlen', $titles));


for ($i=0; $i <= count($titles); $i++)
{
        CLI::write(
                // Display the title on the left of the row
                $title[$i] . '   ' .
                // Wrap the descriptions in a right-hand column
                // with its left side 3 characters wider than
                // the longest item on the left.
                CLI::wrap($descriptions[$i], 40, $maxlen + 3)
        );
}

將創(chuàng)建如下內(nèi)容:

task1a     Lorem Ipsum is simply dummy
           text of the printing and typesetting
           industry.
task1abc   Lorem Ipsum has been the industry's
           standard dummy text ever since the

newLine()

newLine()方法向用戶顯示空白行。它不帶任何參數(shù):

CLI::newLine();

clearScreen()

您可以使用該clearScreen()方法清除當(dāng)前終端窗口。在Windows的大多數(shù)版本中,由于Windows不支持此功能,因此只會插入40行空白行。Windows 10 bash集成應(yīng)更改此:

CLI::clearScreen();

showProgress()

如果您有一個長期運(yùn)行的任務(wù),想讓用戶了解進(jìn)度,則可以使用 showProgress()顯示如下內(nèi)容的方法:

[####......] 40% Complete

該塊在適當(dāng)位置具有動畫效果,效果非常好。

要使用它,請將當(dāng)前步驟作為第一個參數(shù),并將步驟總數(shù)作為第二個參數(shù)。完成百分比和顯示長度將根據(jù)該數(shù)字確定。完成后,將pass false作為第一個參數(shù),進(jìn)度條將被刪除。

$totalSteps = count($tasks);
$currStep   = 1;


foreach ($tasks as $task)
{
        CLI::showProgress($currStep++, $totalSteps);
        $task->run();
}


// Done, so erase it...
CLI::showProgress(false);

table()

$thead = ['ID', 'Title', 'Updated At', 'Active'];
$tbody = [
        [7, 'A great item title', '2017-11-15 10:35:02', 1],
        [8, 'Another great item title', '2017-11-16 13:46:54', 0]
];


CLI::table($tbody, $thead);
+----+--------------------------+---------------------+--------+
| ID | Title                    | Updated At          | Active |
+----+--------------------------+---------------------+--------+
| 7  | A great item title       | 2017-11-16 10:35:02 | 1      |
| 8  | Another great item title | 2017-11-16 13:46:54 | 0      |
+----+--------------------------+---------------------+--------+

wait()

等待一定的秒數(shù),可以選擇顯示一條等待消息并等待按鍵。

// wait for specified interval, with countdown displayed
CLI::wait($seconds, true);


// show continuation message and wait for input
CLI::wait(0, false);


// wait for specified interval
CLI::wait($seconds, false);
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號