0 フォロワー

コンソールアプリケーション

Web アプリケーションを構築するための豊富な機能に加えて、Yii は、主に Web サイトに対して実行する必要があるバックグラウンドタスクやメンテナンスタスクを作成するために使用されるコンソールアプリケーションも完全にサポートしています。

コンソールアプリケーションの構造は、Yii Web アプリケーションと非常によく似ています。これは、1 つ以上の yii\console\Controller クラスで構成されており、コンソール環境ではしばしば * コマンド * と呼ばれます。各コントローラには、Web コントローラと同様に、1 つ以上のアクションを含めることもできます。

両方のプロジェクトテンプレートには、コンソールアプリケーションが既に含まれています。これは、リポジトリのベースディレクトリにある yii スクリプトを呼び出すことによって実行できます。これにより、さらにパラメータを指定せずに実行すると、利用可能なコマンドのリストが表示されます。

Running ./yii command for help output

スクリーンショットでわかるように、Yii はデフォルトで利用可能な一連のコマンドをすでに定義しています。

使い方

コンソールコントローラのアクションを実行するには、次の構文を使用します。

yii <route> [--option1=value1 ... argument1 argument2 ... --option2=value2]

オプションは任意の位置で指定できます。

上記において、<route> はコントローラのアクションへのルートを指します。オプションはクラスのプロパティに設定され、引数はアクションメソッドのパラメータとなります。

例として、migrations に設定されたMigrateController::$migrationTableと、マイグレーションの制限を5に設定したMigrateController::actionUp()は、次のように呼び出すことができます。

yii migrate/up 5 --migrationTable=migrations

注: コンソールで * を使用する場合は、現在のディレクトリのすべてのファイル名に置き換えられるシェルグロブとして実行されないように、"*" として引用符で囲むことを忘れないでください。

エントリスクリプト

コンソールアプリケーションのエントリスクリプトは、ウェブアプリケーションで使用される index.php ブートストラップファイルと同等です。コンソールエントリスクリプトは通常 yii と呼ばれ、アプリケーションのルートディレクトリに配置されます。これには、次のようなコードが含まれています。

#!/usr/bin/env php
<?php
/**
 * Yii console bootstrap file.
 */

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';

$config = require __DIR__ . '/config/console.php';

$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);

このスクリプトはアプリケーションの一部として作成されます。必要に応じて自由に編集できます。エラー時にスタックトレースを表示したくない場合、または全体的なパフォーマンスを向上させたい場合は、YII_DEBUG 定数を false に設定できます。基本および高度なアプリケーションテンプレートの両方で、コンソールアプリケーションのエントリスクリプトは、開発者フレンドリーな環境を提供するために、デフォルトでデバッグが有効になっています。

設定

上記のコードでわかるように、コンソールアプリケーションは console.php という独自の設定ファイルを使用します。このファイルでは、特にコンソールアプリケーション用のさまざまなアプリケーションコンポーネントとプロパティを設定する必要があります。

ウェブアプリケーションとコンソールアプリケーションが多くの設定パラメータと値を共有している場合は、共通部分を別のファイルに移動し、このファイルを両方のアプリケーション設定(ウェブとコンソール)に含めることを検討してください。この例は、高度なプロジェクトテンプレートで見ることができます。

ヒント: エントリスクリプトで指定されたものとは異なるアプリケーション設定を使用してコンソールコマンドを実行したい場合があります。たとえば、yii migrate コマンドを使用して、個々のテストスイートで構成されたテストデータベースをアップグレードしたい場合があります。設定を動的に変更するには、コマンドを実行するときに appconfig オプションを使用してカスタムアプリケーション設定ファイルを指定するだけです。

yii <route> --appconfig=path/to/config.php ...

コンソールコマンドの補完

コマンド引数の自動補完は、シェルを操作する際に役立ちます。バージョン 2.0.11 以降、./yii コマンドは Bash および ZSH の自動補完をすぐに提供します。

Bash補完

Bash補完がインストールされていることを確認してください。ほとんどのインストールでは、デフォルトで利用可能です。

補完スクリプトを /etc/bash_completion.d/ に配置します。

 curl -L https://raw.githubusercontent.com/yiisoft/yii2/master/contrib/completion/bash/yii -o /etc/bash_completion.d/yii

一時的な使用の場合は、ファイルを現在のディレクトリに置き、source yii を介して現在のセッションに含めることができます。グローバルにインストールした場合は、ターミナルを再起動するか、source ~/.bashrc を実行してアクティブにする必要がある場合があります。

補完スクリプトを環境に含める他の方法については、Bash Manualを確認してください。

ZSH補完

補完用のディレクトリに補完スクリプトを配置します。例:~/.zsh/completion/

mkdir -p ~/.zsh/completion
curl -L https://raw.githubusercontent.com/yiisoft/yii2/master/contrib/completion/zsh/_yii -o ~/.zsh/completion/_yii

ディレクトリを $fpath に含めます。例:~/.zshrc に追加します。

fpath=(~/.zsh/completion $fpath)

compinit がロードされていることを確認するか、~/.zshrc に追加してロードしてください。

autoload -Uz compinit && compinit -i

次に、シェルをリロードします。

exec $SHELL -l

独自のコンソールコマンドの作成

コンソールコントローラとアクション

コンソールコマンドは、yii\console\Controller を継承するコントローラクラスとして定義されます。コントローラクラスでは、コントローラのサブコマンドに対応する1つ以上のアクションを定義します。各アクション内では、その特定のサブコマンドの適切なタスクを実装するコードを記述します。

コマンドを実行するときは、コントローラアクションへのルートを指定する必要があります。たとえば、ルート migrate/create は、MigrateController::actionCreate() アクションメソッドに対応するサブコマンドを呼び出します。実行時に提供されたルートにアクションIDが含まれていない場合、デフォルトのアクションが実行されます(ウェブコントローラと同様)。

オプション

yii\console\Controller::options() メソッドをオーバーライドすることで、コンソールコマンド(コントローラ/アクションID)で使用可能なオプションを指定できます。このメソッドは、コントローラクラスのパブリックプロパティのリストを返す必要があります。コマンドを実行するときに、構文 --optionName=optionValue を使用してオプションの値を指定できます。これにより、optionValue がコントローラクラスの optionName プロパティに割り当てられます。

オプションのデフォルト値が配列型で、コマンドの実行中にこのオプションを設定した場合、入力文字列をコンマで分割することで、オプションの値が配列に変換されます。

オプションのエイリアス

バージョン2.0.8以降、コンソールコマンドは、オプションのエイリアスを追加するyii\console\Controller::optionAliases()メソッドを提供します。

エイリアスを定義するには、コントローラで yii\console\Controller::optionAliases() をオーバーライドします。例:

namespace app\commands;

use yii\console\Controller;

class HelloController extends Controller
{
    public $message;
    
    public function options($actionID)
    {
        return ['message'];
    }
    
    public function optionAliases()
    {
        return ['m' => 'message'];
    }
    
    public function actionIndex()
    {
        echo $this->message . "\n";
    }
}

これで、次の構文を使用してコマンドを実行できます。

yii hello -m=hello

引数

オプションに加えて、コマンドは引数も受け取ることができます。引数は、リクエストされたサブコマンドに対応するアクションメソッドへのパラメータとして渡されます。最初の引数は最初のパラメータに、2番目の引数は2番目のパラメータに、といった具合に対応します。コマンドの呼び出し時に十分な引数が提供されなかった場合、対応するパラメータは、定義されている場合は宣言されたデフォルト値を受け取ります。デフォルト値が設定されておらず、実行時に値が提供されなかった場合、コマンドはエラーで終了します。

array 型ヒントを使用して、引数を配列として扱う必要があることを示すことができます。配列は、入力文字列をコンマで分割することによって生成されます。

次の例は、引数を宣言する方法を示しています。

class ExampleController extends \yii\console\Controller
{
    // The command "yii example/create test" will call "actionCreate('test')"
    public function actionCreate($name) { ... }

    // The command "yii example/index city" will call "actionIndex('city', 'name')"
    // The command "yii example/index city id" will call "actionIndex('city', 'id')"
    public function actionIndex($category, $order = 'name') { ... }

    // The command "yii example/add test" will call "actionAdd(['test'])"
    // The command "yii example/add test1,test2" will call "actionAdd(['test1', 'test2'])"
    public function actionAdd(array $name) { ... }
}

終了コード

終了コードを使用することは、コンソールアプリケーション開発のベストプラクティスです。慣例的に、コマンドはすべてが正常であることを示すために 0 を返します。コマンドがゼロより大きい数を返した場合、それはエラーを示すものと見なされます。返される数値はエラーコードとなり、エラーに関する詳細を見つけるために使用できる可能性があります。たとえば、1 は一般的に不明なエラーを表し、それ以上のすべてのコードは、入力エラー、ファイル不足など、特定のケース用に予約されます。

コンソールコマンドに終了コードを返させるには、コントローラアクションメソッドで整数を返すだけです。

public function actionIndex()
{
    if (/* some problem */) {
        echo "A problem occurred!\n";
        return 1;
    }
    // do something
    return 0;
}

使用できる事前定義された定数がいくつかあります。これらは yii\console\ExitCode クラスで定義されています。

public function actionIndex()
{
    if (/* some problem */) {
        echo "A problem occurred!\n";
        return ExitCode::UNSPECIFIED_ERROR;
    }
    // do something
    return ExitCode::OK;
}

より具体的なエラーコードタイプがある場合は、コントローラに意味のある定数を定義することをお勧めします。

書式設定と色

Yiiコンソールは、コマンドを実行するターミナルでサポートされていない場合、自動的に書式設定されていないものに劣化する書式設定された出力をサポートします。

書式設定された文字列の出力は簡単です。太字のテキストを出力する方法は次のとおりです。

$this->stdout("Hello?\n", Console::BOLD);

複数のスタイルを組み合わせて動的に文字列を構築する必要がある場合は、ansiFormat()を使用することをお勧めします。

$name = $this->ansiFormat('Alex', Console::FG_YELLOW);
echo "Hello, my name is $name.";

テーブル

バージョン2.0.13以降、コンソールでテーブルデータを書式設定できるウィジェットがあります。これは次のように使用できます。

echo Table::widget([
    'headers' => ['Project', 'Status', 'Participant'],
    'rows' => [
        ['Yii', 'OK', '@samdark'],
        ['Yii', 'OK', '@cebe'],
    ],
]);

詳細については、APIドキュメントを参照してください。

タイプミスを見つけたり、このページを改善する必要があると思った場合は?
githubで編集 !