CLIライブラリ

CodeIgniterのCLIライブラリを使用すると、インタラクティブなコマンドラインスクリプトを簡単に作成できます。これには、以下が含まれます。

  • 詳細情報をユーザーに求める

  • ターミナルに複数色のテキストを書き込む

  • ビープ音を鳴らす(優しく!)

  • 長いタスク中にプログレスバーを表示する

  • ウィンドウに合わせて長いテキスト行を折り返す。

クラスの初期化

CLIライブラリのメソッドはすべて静的であるため、インスタンスを作成する必要はありません。代わりに、クラスの上にある use ステートメントを使用して、コントローラがライブラリを見つけられるようにするだけです。

<?php

namespace App\Commands;

use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;

class MyCommand extends BaseCommand
{
    // ...

    public function run(array $params)
    {
        // ...
    }
}

クラスは、ファイルが最初にロードされたときに自動的に初期化されます。

ユーザーからの入力を取得する

ユーザーに追加情報を要求する必要がある場合があります。ユーザーがオプションのコマンドライン引数を指定しなかった場合や、スクリプトが既存のファイルに遭遇し、上書きする前に確認が必要な場合があります。これは prompt() または promptByKey() メソッドで処理されます。

注意

v4.3.0以降では、PhpStreamWrapper を使用してこれらのメソッドのテストを作成できます。「CLI入力のテスト」を参照してください。

prompt()

最初のパラメータとして質問を渡すことで、質問を提供できます。

<?php

use CodeIgniter\CLI\CLI;

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

ユーザーがEnterキーを押しただけの場合に使用されるデフォルトの回答を、2番目のパラメータに渡すことで提供できます。

<?php

use CodeIgniter\CLI\CLI;

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

許可された回答の配列を2番目のパラメータとして渡すことで、受け入れ可能な回答を制限できます。

<?php

use CodeIgniter\CLI\CLI;

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

最後に、バリデーションルールを、3番目のパラメータとして回答入力に渡すことができます。

<?php

use CodeIgniter\CLI\CLI;

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

バリデーションルールは、配列構文で記述することもできます。

<?php

use CodeIgniter\CLI\CLI;

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

promptByKey()

プロンプトの事前定義された回答(オプション)は、説明が必要な場合や、その値を介して選択するには複雑すぎる場合があります。promptByKey() を使用すると、ユーザーは値ではなくキーでオプションを選択できます。

<?php

use CodeIgniter\CLI\CLI;

$fruit = CLI::promptByKey('These are your choices:', ['The red apple', 'The plump orange', 'The ripe banana']);
/*
 * These are your choices:
 *   [0]  The red apple
 *   [1]  The plump orange
 *   [2]  The ripe banana
 *
 * [0, 1, 2]:
 */

名前付きキーも可能です。

<?php

use CodeIgniter\CLI\CLI;

$fruit = CLI::promptByKey(['These are your choices:', 'Which would you like?'], [
    'apple'  => 'The red apple',
    'orange' => 'The plump orange',
    'banana' => 'The ripe banana',
]);
/*
 * These are your choices:
 *   [apple]   The red apple
 *   [orange]  The plump orange
 *   [banana]  The ripe banana
 *
 * Which would you like? [apple, orange, banana]:
 */

最後に、バリデーションルールを、3番目のパラメータとして回答入力に渡すことができます。受け入れ可能な回答は、渡されたオプションに自動的に制限されます。

promptByMultipleKeys()

バージョン4.3.0の新機能。

このメソッドは promptByKey() と同じですが、複数の値をサポートします。

<?php

use CodeIgniter\CLI\CLI;

$hobbies = CLI::promptByMultipleKeys('Select your hobbies:', ['Playing game', 'Sleep', 'Badminton']);
/*
 * Select your hobbies:
 *   [0]  Playing game
 *   [1]  Sleep
 *   [2]  Badminton
 *
 * You can specify multiple values separated by commas.
 * [0, 1, 2]:
 *
 * if your answer is '0,2', the return is the key and the value of the options :
 * [
 *   [0] => "Playing game",
 *   [2] => "Badminton"
 * ]
 */

重要

promptByMultipleKeys() メソッドは、promptByKey() とは異なり、名前付きキーまたはバリデーションをサポートしていません。

フィードバックの提供

write()

ユーザーにフィードバックを提供するために、いくつかのメソッドが用意されています。これは、単一のステータス更新から、ユーザーのターミナルウィンドウに合わせて折り返す複雑な情報テーブルまで、さまざまです。このコアとなるのは、最初のパラメータとして出力する文字列を受け取る write() メソッドです。

<?php

use CodeIgniter\CLI\CLI;

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

2番目のパラメータとして色の名前を渡すことで、テキストの色を変更できます。

<?php

use CodeIgniter\CLI\CLI;

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

これは、ステータスによってメッセージを区別したり、異なる色を使用して「ヘッダー」を作成したりするために使用できます。3番目のパラメータとして色の名前を渡すことで、背景色を設定することもできます。

<?php

use CodeIgniter\CLI\CLI;

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

また、背景色として使用できるのは、より少ない数です。

  • black

  • blue

  • green

  • cyan

  • red

  • yellow

  • light_gray

  • magenta

print()

Printは write() メソッドと同一に機能しますが、前後に改行を強制しません。代わりに、カーソルが現在ある場所に画面に出力します。これにより、異なる呼び出しから複数のアイテムをすべて同じ行に出力できます。これは、ステータスを表示し、何かを実行してから、同じ行に「Done」を出力する場合に特に役立ちます。

<?php

use CodeIgniter\CLI\CLI;

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

color()

write() コマンドは、ターミナルに1行を書き込み、EOL文字で終了しますが、color() メソッドを使用すると、同じ方法で使用できる文字列フラグメントを作成できます。ただし、出力後にEOLを強制しません。これにより、同じ行に複数の出力を作成できます。または、より一般的には、write() メソッド内で使用して、内部に異なる色の文字列を作成できます。

<?php

use CodeIgniter\CLI\CLI;

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

この例では、ウィンドウに1行を出力し、fileA を黄色で、その後にタブ、/path/to/file を白のテキストで出力します。

error()

エラーを出力する必要がある場合は、適切な名前の error() メソッドを使用する必要があります。これにより、write() および color() のように、STDOUTではなくSTDERRに明るい赤色のテキストが書き込まれます。これは、スクリプトがエラーを監視している場合に、すべての情報ではなく実際のエラーメッセージのみをふるいにかける必要がないため、役立ちます。write() メソッドとまったく同じように使用します。

<?php

use CodeIgniter\CLI\CLI;

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

wrap()

このコマンドは、文字列を受け取り、現在の行への出力開始して、新しい行で設定された長さに折り返します。これは、現在のウィンドウで折り返して画面外に出ないようにしたい説明付きのオプションのリストを表示する場合に役立ちます。

<?php

use CodeIgniter\CLI\CLI;

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

デフォルトでは、文字列はターミナルの幅に合わせて折り返されます。Windows は現在、ウィンドウサイズを決定する方法を提供していないため、デフォルトでは 80 文字に設定されています。ウィンドウ内に確実に収まるように、幅をより短く制限したい場合は、2 番目のパラメーターとして最大行の長さを渡してください。これにより、単語が分割されないように、最も近い単語の区切りで文字列が分割されます。

<?php

use CodeIgniter\CLI\CLI;

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

タイトル、ファイル、またはタスクの左側に列を配置し、右側に説明を含むテキストの列を配置したい場合があります。デフォルトでは、これはウィンドウの左端に折り返されるため、列が揃いません。このような場合、最初の行以降のすべての行にスペース数を渡してパディングすることで、左側にくっきりとした列の端を作成できます。

<?php

use CodeIgniter\CLI\CLI;

$titles = [
    'task1a',
    'task1abc',
];
$descriptions = [
    'Lorem Ipsum is simply dummy text of the printing and typesetting industry.',
    "Lorem Ipsum has been the industry's standard dummy text ever since the",
];

// 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
        substr(
            $titles[$i] . str_repeat(' ', $maxlen + 3),
            0,
            $maxlen + 3
        ) .
        // 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)
    );
}

以下のようなものが作成されます。

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() メソッドは、空白行をユーザーに表示します。パラメーターは取りません。

<?php

use CodeIgniter\CLI\CLI;

CLI::newLine();

clearScreen()

clearScreen() メソッドを使用すると、現在のターミナルウィンドウをクリアできます。ほとんどの Windows バージョンでは、この機能がサポートされていないため、単に 40 個の空白行が挿入されます。Windows 10 の bash 統合では、これが変更されるはずです。

<?php

use CodeIgniter\CLI\CLI;

CLI::clearScreen();

showProgress()

ユーザーに進捗状況を知らせたい長時間実行タスクがある場合は、次のようなものを表示する showProgress() メソッドを使用できます。

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

このブロックは、非常に見栄えの良い効果のために、その場でアニメーション化されます。

これを使用するには、最初のパラメーターとして現在のステップ、2 番目のパラメーターとしてステップの合計数を渡します。完了率と表示の長さは、その数に基づいて決定されます。完了したら、最初のパラメーターとして false を渡すと、プログレスバーが削除されます。

<?php

use CodeIgniter\CLI\CLI;

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

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

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

table()

<?php

use CodeIgniter\CLI\CLI;

$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()

指定された秒数待機し、オプションで待機メッセージを表示し、キー入力を待機します。

<?php

use CodeIgniter\CLI\CLI;

// 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);