Spark コマンドの作成

他のルートと同じように、CLI を介してコントローラーを使用できる機能は便利ですが、少し違うものが必要になる場合があります。そこで、Spark コマンドが登場します。これらは、ルートを定義する必要がない単純なクラスであり、マイグレーションやデータベースのシーディング、cronjob のステータスのチェック、または会社用のカスタムコードジェネレーターの構築など、開発者が作業を簡単にするために使用できるツールを構築するのに最適です。

新しいコマンドの作成

開発で使用する新しいコマンドを非常に簡単に作成できます。各クラスは独自のファイルに存在する必要があり、CodeIgniter\CLI\BaseCommand を拡張し、run() メソッドを実装する必要があります。

CLI コマンドにリストされ、コマンドにヘルプ機能を追加するには、次のプロパティを使用する必要があります。

  • $group: コマンドをリストするときにコマンドがまとめられるグループを説明する文字列。例: Database

  • $name: コマンドの名前を説明する文字列。例: make:controller

  • $description: コマンドを説明する文字列。例: 新しい コントローラー ファイルを 生成します。

  • $usage: コマンドの使用法を説明する文字列。例: make:controller <name> [オプション]

  • $arguments: 各コマンド引数を説明する文字列の配列。例: 'name' => 'コントローラー クラス 名。'

  • $options: 各コマンドオプションを説明する文字列の配列。例: '--force' => '既存の ファイルを 強制的に 上書きします。'

ヘルプの説明は、上記のパラメーターに従って自動的に生成されます。

ファイルの場所

コマンドは、Commands という名前のディレクトリ内に保存する必要があります。ただし、そのディレクトリは、オートローダー がそれを検出できるように、PSR-4 名前空間に配置する必要があります。これは、app/Commands にするか、Acme/Commands のように、すべてのプロジェクト開発で使用するためにコマンドを保持するディレクトリに配置できます。

注意

コマンドが実行されると、完全な CodeIgniter CLI 環境がロードされ、環境情報、パス情報を取得したり、コントローラーを作成するときに使用するツールを使用したりできます。

コマンドの例

デモンストレーションの目的で、アプリケーション自体の基本情報を報告するだけの例のコマンドを見ていきましょう。まず、app/Commands/AppInfo.php に新しいファイルを作成します。次のコードを含める必要があります。

<?php

namespace App\Commands;

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

class AppInfo extends BaseCommand
{
    protected $group       = 'Demo';
    protected $name        = 'app:info';
    protected $description = 'Displays basic application information.';

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

list コマンドを実行すると、新しいコマンドが独自の Demo グループの下にリストされているのがわかります。よく見ると、これがどのように機能するかが簡単にわかるはずです。$group プロパティは、他の既存のすべてのコマンドでこのコマンドをどのように整理するか、どの見出しの下にリストするかを示すだけです。

$name プロパティは、このコマンドを呼び出すことができる名前です。唯一の要件は、スペースを含んではならず、すべての文字がコマンドライン自体で有効である必要があることです。ただし、慣例として、コマンドは小文字で、コマンドのさらなるグループ化は、コマンド名自体にコロンを使用することで行われます。これにより、複数のコマンドが名前の衝突を起こすのを防ぐことができます。

最後のプロパティである $description は、list コマンドに表示される短い文字列で、コマンドが何をするかを説明する必要があります。

run()

run() メソッドは、コマンドが実行されるときに呼び出されるメソッドです。$params 配列は、使用するためのコマンド名の後の CLI 引数のリストです。CLI 文字列が

php spark foo bar baz

の場合、foo はコマンド名であり、$params 配列は次のようになります。

<?php

$params = ['bar', 'baz'];

これは、CLI ライブラリを介してアクセスすることもできますが、これには文字列からコマンドがすでに削除されています。これらのパラメーターは、スクリプトの動作をカスタマイズするために使用できます。

デモコマンドには、次のような run() メソッドがある場合があります。

<?php

namespace App\Commands;

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

class AppInfo extends BaseCommand
{
    // ...

    public function run(array $params)
    {
        CLI::write('PHP Version: ' . CLI::color(PHP_VERSION, 'yellow'));
        CLI::write('CI Version: ' . CLI::color(\CodeIgniter\CodeIgniter::CI_VERSION, 'yellow'));
        CLI::write('APPPATH: ' . CLI::color(APPPATH, 'yellow'));
        CLI::write('SYSTEMPATH: ' . CLI::color(SYSTEMPATH, 'yellow'));
        CLI::write('ROOTPATH: ' . CLI::color(ROOTPATH, 'yellow'));
        CLI::write('Included files: ' . CLI::color(count(get_included_files()), 'yellow'));
    }
}

詳細については、CLI ライブラリのページを参照してください。

コマンドの終了

デフォルトでは、コマンドは成功コード 0 で終了します。コマンドの実行中にエラーが発生した場合、run() メソッドで終了コードを使用して return 言語構成を使用することでコマンドを終了できます。

たとえば、return EXIT_ERROR;

このアプローチは、コマンドがたとえば crontab を介して実行される場合に、システムレベルでのデバッグに役立ちます。

app/Config/Constants.php ファイルで定義されている EXIT_* 終了コード定数を使用できます。

BaseCommand

すべてのコマンドが拡張する必要のある BaseCommand クラスには、独自のコマンドを作成する際に知っておくべきいくつかの便利なユーティリティメソッドがあります。また、$this->logger で利用可能な Logger もあります。

class CodeIgniter\CLI\BaseCommand
call(string $command[, array $params = []])
パラメータ:
  • $command (string) – 呼び出す別のコマンドの名前。

  • $params (array) – そのコマンドで利用可能にする追加のCLI引数。

このメソッドを使用すると、現在のコマンドの実行中に他のコマンドを実行できます。

<?php

$this->call('command_one');
$this->call('command_two', $params);
showError(Throwable $e)
パラメータ:
  • $e (Throwable) – エラーレポートに使用する例外。

CLIへの一貫性のある明確なエラー出力を維持するための便利なメソッド。

<?php

try {
    // ...
} catch (\Exception $e) {
    $this->showError($e);
}
showHelp()

コマンドのヘルプ(使い方、引数、説明、オプション)を表示するメソッド。

setPad(string $item, int $max, int $extra = 2, int $indent = 0) string
パラメータ:
  • $item (string) – 文字列の項目。

  • $max (integer) – 最大サイズ。

  • $extra (integer) – 末尾に追加する追加スペースの数。

  • $indent (integer) – インデントのスペース。

すべてのタイトルが同じ長さになり、説明が綺麗に揃うように、文字列をパディングします。

use CodeIgniter\CLI\CLI;

$length = max(array_map('strlen', array_keys($this->options)));

foreach ($this->options as $option => $description) {
    CLI::write(CLI::color($this->setPad($option, $length, 2, 2), 'green') . $description);
}
/*
 * Output will be:
 *  -n     Set migration namespace
 *  -g     Set database group
 *  --all  Set for all namespaces, will ignore (-n) option
 */
getPad($array, $pad)

バージョン 4.0.5 から非推奨: 代わりに CodeIgniter\CLI\BaseCommand::setPad() を使用してください。

パラメータ:
  • $array (array) – $key => $value 配列。

  • $pad (integer) – パディングのスペース。

$key => $value 配列出力のパディングを計算するメソッド。パディングは、CLI で適切にフォーマットされたテーブルを出力するために使用できます。