Web アプリケーションを構築するための豊富な機能に加えて、Yii は、主に Web サイトに対して実行する必要があるバックグラウンドタスクやメンテナンスタスクを作成するために使用されるコンソールアプリケーションも完全にサポートしています。
コンソールアプリケーションの構造は、Yii Web アプリケーションと非常によく似ています。これは、1 つ以上の yii\console\Controller クラスで構成されており、コンソール環境ではしばしば * コマンド * と呼ばれます。各コントローラには、Web コントローラと同様に、1 つ以上のアクションを含めることもできます。
両方のプロジェクトテンプレートには、コンソールアプリケーションが既に含まれています。これは、リポジトリのベースディレクトリにある yii
スクリプトを呼び出すことによって実行できます。これにより、さらにパラメータを指定せずに実行すると、利用可能なコマンドのリストが表示されます。
スクリーンショットでわかるように、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補完がインストールされていることを確認してください。ほとんどのインストールでは、デフォルトで利用可能です。
補完スクリプトを /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/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で編集 !
コメントするには、サインアップまたはログインしてください。