アプリケーションは、Yii アプリケーションシステムの全体的な構造とライフサイクルを管理するオブジェクトです。各 Yii アプリケーションシステムには、エントリスクリプトで作成され、`\Yii::$app`という式でグローバルにアクセスできる、単一のアプリケーションオブジェクトが含まれています。
情報: コンテキストによっては、「アプリケーション」はアプリケーションオブジェクトまたはアプリケーションシステムのいずれかを意味する場合があります。
アプリケーションには、Web アプリケーションとコンソールアプリケーションの2種類があります。名前が示すように、前者は主にWebリクエストを処理し、後者はコンソールコマンドリクエストを処理します。
エントリスクリプトがアプリケーションを作成すると、設定を読み込み、次のようにアプリケーションに適用します。
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
// load application configuration
$config = require __DIR__ . '/../config/web.php';
// instantiate and configure the application
(new yii\web\Application($config))->run();
通常の設定と同様に、アプリケーション設定はアプリケーションオブジェクトのプロパティを初期化する方法を指定します。アプリケーション設定は非常に複雑になることが多いため、通常は設定ファイル(上記の例では`web.php`ファイルなど)に保存されます。
アプリケーション設定で設定する必要がある重要なアプリケーションプロパティが多数あります。これらのプロパティは、通常、アプリケーションが実行されている環境を記述します。たとえば、アプリケーションはコントローラーの読み込み方法、一時ファイルの保存場所などを認識する必要があります。以下では、これらのプロパティを要約します。
どのアプリケーションでも、少なくとも2つのプロパティ、idとbasePathを設定する必要があります。
idプロパティは、アプリケーションを他のアプリケーションと区別する一意のIDを指定します。これは主にプログラムで利用されます。必須ではありませんが、最適な相互運用性のために、アプリケーションIDを指定する際には英数字のみを使用することをお勧めします。
basePathプロパティは、アプリケーションのルートディレクトリを指定します。これは、アプリケーションシステムのすべての保護されたソースコードを含むディレクトリです。このディレクトリの下には、通常、MVCパターンに対応するソースコードを含む`models`、`views`、`controllers`などのサブディレクトリがあります。
ディレクトリパスまたはパスエイリアスを使用してbasePathプロパティを設定できます。どちらの形式でも、対応するディレクトリが存在する必要があります。存在しない場合、例外がスローされます。パスは`realpath()`関数を呼び出すことで正規化されます。
basePath プロパティは、他の重要なパス(例:ランタイムパス)を導出するために頻繁に使用されます。このため、このパスを表すエイリアス @app
があらかじめ定義されています。導出されたパスは、このエイリアスを使用して形成できます(例:ランタイムディレクトリを参照するには @app/runtime
)。
この小節で説明するプロパティは、アプリケーションによって異なるため、多くの場合、構成する必要があります。
このプロパティを使用すると、配列でエイリアスのセットを定義できます。配列のキーはエイリアスの名前であり、配列の値は対応するパスの定義です。例えば
[
'aliases' => [
'@name1' => 'path/to/path1',
'@name2' => 'path/to/path2',
],
]
このプロパティは、Yii::setAlias() メソッドを呼び出すのではなく、アプリケーションの設定でエイリアスを定義できるように提供されています。
これは非常に便利なプロパティです。アプリケーションのブートストラッププロセス中に実行する必要があるコンポーネントの配列を指定できます。たとえば、モジュールを使用してURLルールをカスタマイズする場合は、このプロパティの要素としてそのIDをリストできます。
このプロパティにリストされている各コンポーネントは、次のいずれかの形式で指定できます。
例えば
[
'bootstrap' => [
// an application component ID or module ID
'demo',
// a class name
'app\components\Profiler',
// a configuration array
[
'class' => 'app\components\Profiler',
'level' => 3,
],
// an anonymous function
function () {
return new app\components\Profiler();
}
],
]
情報:モジュールIDがアプリケーションコンポーネントIDと同じ場合、ブートストラッププロセス中にアプリケーションコンポーネントが使用されます。代わりにモジュールを使用する場合は、次のようない無名関数を使用して指定できます。
[ function () { return Yii::$app->getModule('user'); }, ]
ブートストラッププロセス中に、各コンポーネントがインスタンス化されます。コンポーネントクラスがyii\base\BootstrapInterfaceを実装している場合、そのbootstrap()メソッドも呼び出されます。
Basic Project Templateのアプリケーション設定におけるもう1つの実用的な例として、アプリケーションが開発環境で実行されている場合、debug
モジュールとgii
モジュールがブートストラップコンポーネントとして構成されています。
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
}
注意:
bootstrap
にコンポーネントを多く入れると、各リクエストに対して同じコンポーネントセットを実行する必要があるため、アプリケーションのパフォーマンスが低下します。したがって、ブートストラップコンポーネントは慎重に使用してください。
このプロパティはWebアプリケーションのみでサポートされています。すべてのユーザーリクエストを処理する必要があるコントローラーアクションを指定します。これは主に、アプリケーションがメンテナンスモードであり、単一のアクションを介してすべての着信リクエストを処理する必要がある場合に使用されます。
構成は、最初の要素がアクションのルートを指定する配列です。配列の残りの要素(キーと値のペア)は、アクションにバインドするパラメーターを指定します。例えば
[
'catchAll' => [
'offline/notice',
'param1' => 'value1',
'param2' => 'value2',
],
]
情報:このプロパティが有効になっている場合、開発環境でのデバッグパネルは機能しません。
これは最も重要なプロパティです。他の場所で使用できる、アプリケーションコンポーネントと呼ばれる名前付きコンポーネントのリストを登録できます。例えば
[
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
],
]
各アプリケーションコンポーネントは、配列内のキーと値のペアとして指定されます。キーはコンポーネントIDを表し、値はコンポーネントクラス名または構成を表します。
アプリケーションに任意のコンポーネントを登録でき、後で\Yii::$app->componentID
という式を使用してグローバルにアクセスできます。
詳細については、アプリケーションコンポーネントセクションを参照してください。
このプロパティを使用すると、コントローラーIDを任意のコントローラークラスにマップできます。デフォルトでは、Yiiは規則に基づいてコントローラーIDをコントローラークラスにマップします(例:ID post
はapp\controllers\PostController
にマップされます)。このプロパティを構成することにより、特定のコントローラーの規則を破ることができます。次の例では、account
はapp\controllers\UserController
に、article
はapp\controllers\PostController
にマップされます。
[
'controllerMap' => [
'account' => 'app\controllers\UserController',
'article' => [
'class' => 'app\controllers\PostController',
'enableCsrfValidation' => false,
],
],
]
このプロパティの配列キーはコントローラーIDを表し、配列の値は対応するコントローラークラス名または構成を表します。
このプロパティは、コントローラークラスが存在するデフォルトの名前空間を指定します。デフォルトはapp\controllers
です。コントローラーIDがpost
の場合、規則により、対応するコントローラークラス名(名前空間なし)はPostController
になり、完全修飾クラス名はapp\controllers\PostController
になります。
コントローラークラスは、この名前空間に対応するディレクトリのサブディレクトリにも配置できます。たとえば、コントローラーIDがadmin/post
の場合、対応する完全修飾コントローラークラスはapp\controllers\admin\PostController
になります。
完全修飾コントローラークラスは自動ロード可能であること、およびコントローラークラスの実際の名前空間がこのプロパティの値と一致することが重要です。そうでない場合、アプリケーションにアクセスすると「ページが見つかりません」エラーが発生します。
上記のように規則を破る場合は、controllerMapプロパティを構成できます。
このプロパティは、アプリケーションがエンドユーザーにコンテンツを表示する際に使用する言語を指定します。このプロパティのデフォルト値はen
(英語)です。アプリケーションで複数の言語をサポートする必要がある場合は、このプロパティを構成する必要があります。
このプロパティの値は、メッセージの翻訳、日付の書式設定、数値の書式設定など、さまざまな国際化の側面を決定します。たとえば、yii\jui\DatePickerウィジェットは、このプロパティ値をデフォルトで使用して、カレンダーをどの言語で表示するか、日付をどのようにフォーマットするかを決定します。
IETF言語タグで言語を指定することをお勧めします。たとえば、en
は英語を表し、en-US
は英語(米国)を表します。
このプロパティの詳細については、国際化セクションを参照してください。
このプロパティは、アプリケーションに含まれるモジュールを指定します。
このプロパティは、モジュールIDを配列キーとする、モジュールクラスまたは構成の配列を受け取ります。例えば
[
'modules' => [
// a "booking" module specified with the module class
'booking' => 'app\modules\booking\BookingModule',
// a "comment" module specified with a configuration array
'comment' => [
'class' => 'app\modules\comment\CommentModule',
'db' => 'db',
],
],
]
詳細については、モジュールセクションを参照してください。
このプロパティは、エンドユーザーに表示されるアプリケーション名を指定します。一意の値をとる必要があるidプロパティとは異なり、このプロパティの値は主に表示目的のためのものであり、一意である必要はありません。
コードでこのプロパティを使用していない場合は、このプロパティを構成する必要はありません。
このプロパティは、グローバルにアクセス可能なアプリケーションパラメーターの配列を指定します。コード全体でハードコードされた数値や文字列を使用する代わりに、それらを1か所でアプリケーションパラメーターとして定義し、必要な場所でパラメーターを使用することをお勧めします。たとえば、サムネイル画像のサイズを次のようにパラメーターとして定義できます。
[
'params' => [
'thumbnail.size' => [128, 128],
],
]
次に、サイズ値を使用する必要があるコードでは、次のコードを使用するだけで済みます。
$size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0];
後でサムネイルのサイズを変更することにした場合、アプリケーションの設定で変更するだけで済みます。依存関係のあるコードに触れる必要はありません。
このプロパティは、アプリケーションコードが記述されている言語を指定します。デフォルト値は'en-US'
(英語(米国))です。コード内のテキストコンテンツが英語でない場合は、このプロパティを構成する必要があります。
languageプロパティと同様に、IETF言語タグでこのプロパティを構成する必要があります。たとえば、en
は英語を表し、en-US
は英語(米国)を表します。
このプロパティの詳細については、国際化セクションを参照してください。
このプロパティは、PHPランタイムのデフォルトのタイムゾーンを設定する代替方法として提供されています。このプロパティを構成することで、本質的にPHP関数date_default_timezone_set()を呼び出しています。例えば
[
'timeZone' => 'America/Los_Angeles',
]
タイムゾーンの設定の影響の詳細については、日付の書式設定に関するセクションを確認してください。
このプロパティは、アプリケーションのバージョンを指定します。デフォルトは'1.0'
です。コードでこのプロパティを使用していない場合は、このプロパティを構成する必要はありません。
この小節で説明するプロパティは、デフォルト値が一般的な規則から導き出されるため、一般的には構成されません。ただし、規則を破る場合は、それらを構成することもできます。
このプロパティは、アプリケーションが使用する文字セットを指定します。デフォルト値は'UTF-8'
であり、多くの非Unicodeデータを使用するレガシーシステムで作業している場合を除き、ほとんどのアプリケーションではそのままにしておく必要があります。
このプロパティは、リクエストでルートが指定されていない場合にアプリケーションが使用するルートを指定します。ルートには、子モジュールID、コントローラーID、および/またはアクションIDを含めることができます。たとえば、help
、post/create
、またはadmin/post/create
です。アクションIDが指定されていない場合、このプロパティはyii\base\Controller::$defaultActionで指定されたデフォルト値を使用します。
Webアプリケーションの場合、このプロパティのデフォルト値は'site'
であり、これはSiteController
コントローラーとそのデフォルトアクションを使用することを意味します。その結果、ルートを指定せずにアプリケーションにアクセスすると、app\controllers\SiteController::actionIndex()
の結果が表示されます。
コンソールアプリケーションの場合、デフォルト値は'help'
であり、これはコアコマンドyii\console\controllers\HelpController::actionIndex()を使用することを意味します。その結果、引数を指定せずにコマンドyii
を実行すると、ヘルプ情報が表示されます。
このプロパティは、アプリケーションによってインストールおよび使用されている拡張機能のリストを指定します。デフォルトでは、ファイル@vendor/yiisoft/extensions.php
によって返される配列を使用します。extensions.php
ファイルは、Composerを使用して拡張機能をインストールするときに自動的に生成および維持されます。したがって、ほとんどの場合、このプロパティを構成する必要はありません。
拡張機能を手動で管理する特別な場合は、次のようにこのプロパティを構成できます。
[
'extensions' => [
[
'name' => 'extension name',
'version' => 'version number',
'bootstrap' => 'BootstrapClassName', // optional, may also be a configuration array
'alias' => [ // optional
'@alias1' => 'to/path1',
'@alias2' => 'to/path2',
],
],
// ... more extensions like the above ...
],
]
ご覧のように、このプロパティは拡張機能の仕様の配列を受け取ります。各拡張機能は、name
要素とversion
要素からなる配列で指定されます。拡張機能がブートストラップ処理中に実行する必要がある場合、ブートストラップクラス名または設定配列を指定してbootstrap
要素を指定できます。拡張機能はいくつかのエイリアスを定義することもできます。
このプロパティは、ビューのレンダリング時に使用するデフォルトのレイアウトの名前を指定します。デフォルト値は'main'
で、レイアウトパスの下にあるmain.php
レイアウトファイルが使用されます。レイアウトパスとビューパスの両方がデフォルト値を使用している場合、デフォルトのレイアウトファイルはパスエイリアス@app/views/layouts/main.php
で表すことができます。
デフォルトでレイアウトを無効にする場合は、このプロパティをfalse
に設定できますが、これは非常にまれです。
このプロパティは、レイアウトファイルを検索するパスを指定します。デフォルト値は、ビューパスの下にあるlayouts
サブディレクトリです。ビューパスがデフォルト値を使用している場合、デフォルトのレイアウトパスはパスエイリアス@app/views/layouts
で表すことができます。
ディレクトリまたはパスエイリアスとして設定できます。
このプロパティは、ログファイルやキャッシュファイルなどのテンポラリファイルを生成できるパスを指定します。デフォルト値は、エイリアス@app/runtime
で表されるディレクトリです。
ディレクトリまたはパスエイリアスとして設定できます。ランタイムパスは、アプリケーションを実行しているプロセスによって書き込み可能である必要があります。また、その下に含まれるテンポラリファイルには機密情報が含まれる可能性があるため、エンドユーザーがアクセスできないように保護する必要があります。
このパスへのアクセスを簡素化するために、Yiiは@runtime
という名前のパスエイリアスを事前に定義しています。
このプロパティは、ビューファイルが配置されているルートディレクトリを指定します。デフォルト値は、エイリアス@app/views
で表されるディレクトリです。ディレクトリまたはパスエイリアスとして設定できます。
このプロパティは、Composerによって管理されるベンダーディレクトリを指定します。Yiiフレームワークを含む、アプリケーションで使用されるすべてのサードパーティライブラリが含まれています。デフォルト値は、エイリアス@app/vendor
で表されるディレクトリです。
このプロパティは、ディレクトリまたはパスエイリアスとして設定できます。このプロパティを変更する場合は、Composerの設定もそれに合わせて調整してください。
このパスへのアクセスを簡素化するために、Yiiは@vendor
という名前のパスエイリアスを事前に定義しています。
このプロパティは、コンソールアプリケーションのみでサポートされています。Yiiリリースに含まれるコアコマンドを有効にするかどうかを指定します。デフォルト値はtrue
です。
アプリケーションは、リクエストの処理中にいくつかのイベントを発生させます。アプリケーション設定で、これらのイベントにイベントハンドラーを次のようにアタッチできます。
[
'on beforeRequest' => function ($event) {
// ...
},
]
on eventName
構文の使用については、設定セクションで説明されています。
あるいは、アプリケーションインスタンスが作成された後のブートストラップ処理中にイベントハンドラーをアタッチすることもできます。例えば
\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
// ...
});
このイベントは、アプリケーションがリクエストを処理する前に発生します。実際のイベント名はbeforeRequest
です。
このイベントが発生すると、アプリケーションインスタンスは設定および初期化されています。そのため、イベントメカニズムを使用してカスタムコードを挿入し、リクエスト処理プロセスをインターセプトするのに適した場所です。たとえば、イベントハンドラーでは、いくつかのパラメーターに基づいてyii\base\Application::$languageプロパティを動的に設定できます。
このイベントは、アプリケーションがリクエストの処理を完了した後、レスポンスを送信する前に発生します。実際のイベント名はafterRequest
です。
このイベントが発生すると、リクエスト処理が完了し、リクエストのポスト処理を実行したり、レスポンスをカスタマイズしたりする機会があります。
レスポンスコンポーネントも、エンドユーザーにレスポンスコンテンツを送信している間にいくつかのイベントを発生させます。これらのイベントは、このイベントの後に発生します。
このイベントは、すべてのコントローラーアクションを実行する前に発生します。実際のイベント名はbeforeAction
です。
イベントパラメーターはyii\base\ActionEventのインスタンスです。イベントハンドラーはyii\base\ActionEvent::$isValidプロパティをfalse
に設定して、アクションの実行を停止できます。例えば
[
'on beforeAction' => function ($event) {
if (some condition) {
$event->isValid = false;
} else {
}
},
]
同じbeforeAction
イベントは、モジュールとコントローラーによっても発生します。アプリケーションオブジェクトは最初にこのイベントを発生させ、次にモジュール(存在する場合)、最後にコントローラーが続きます。イベントハンドラーがyii\base\ActionEvent::$isValidをfalse
に設定した場合、後続のイベントはすべて発生しなくなります。
このイベントは、すべてのコントローラーアクションを実行した後に発生します。実際のイベント名はafterAction
です。
イベントパラメーターはyii\base\ActionEventのインスタンスです。yii\base\ActionEvent::$resultプロパティを通じて、イベントハンドラーはアクションの結果にアクセスしたり変更したりできます。例えば
[
'on afterAction' => function ($event) {
if (some condition) {
// modify $event->result
} else {
}
},
]
同じafterAction
イベントは、モジュールとコントローラーによっても発生します。これらのオブジェクトは、beforeAction
とは逆の順序でこのイベントを発生させます。つまり、コントローラーが最初にこのイベントを発生させ、次にモジュール(存在する場合)、最後にアプリケーションが続きます。
エントリスクリプトがリクエストを処理するために実行されると、アプリケーションは次のライフサイクルを経ます。
タイプミスを見つけた場合、またはこのページの改善が必要と思われる場合は、
githubで編集してください。 !
コメントするにはサインアップまたはログインしてください。