structure-applications.md 35.7 KB
Newer Older
1 2 3 4 5 6
アプリケーション
================

アプリケーションは Yii アプリケーションシステム全体の構造とライフサイクルを統制するオブジェクトです。
全ての Yii アプリケーションシステムは、それぞれ、[エントリスクリプト](structure-entry-scripts.md) において作成され、`\Yii::$app` という式でグローバルにアクセス可能な、単一のアプリケーションオブジェクトを持ちます。

7
> Info|情報: ガイドの中で「アプリケーション」という言葉は、文脈に応じて、アプリケーションオブジェクトを意味したり、アプリケーションシステムを意味したりします。
8

9
二種類のアプリケーション、すなわち、[[yii\web\Application|ウェブアプリケーション]] と [[yii\console\Application|コンソールアプリケーション]] があります。
10 11 12
名前が示すように、前者は主にウェブのリクエストを処理し、後者はコンソールコマンドのリクエストを処理します。


13
## アプリケーションの構成情報 <span id="application-configurations"></span>
14

15
[エントリスクリプト](structure-entry-scripts.md) は、アプリケーションを作成するときに、下記のように、[構成情報](concept-configurations.md) を読み込んで、それをアプリケーションに適用します。
16 17 18 19 20

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

21
// アプリケーションの構成情報を読み込む
22 23
$config = require(__DIR__ . '/../config/web.php');

24
// アプリケーションのインスタンスを作成し、構成情報を適用する
25 26 27
(new yii\web\Application($config))->run();
```

28 29
通常の [構成情報](concept-configurations.md) と同じように、アプリケーションの構成情報は、アプリケーションオブジェクトのプロパティをどのように初期化するかを指定するものです。
アプリケーションの構成情報は、たいていは非常に複雑なものですから、通常は、上記の例の `web.php` ファイルのように、[構成情報ファイル](concept-configurations.md#configuration-files) に保管されます。
30 31


32
## アプリケーションのプロパティ <span id="application-properties"></span>
33

34
アプリケーションの構成情報で構成すべき重要なアプリケーションのプロパティは数多くあります。
35 36 37 38 39
それらのプロパティの典型的なものは、アプリケーションが走る環境を記述するものです。
例えば、アプリケーションは、どのようにして [コントローラ](structure-controllers.md) をロードするか、また、どこにテンポラリファイルを保存するかなどを知らなければなりません。
以下において、それらのプロパティを要約します。


40
### 必須のプロパティ <span id="required-properties"></span>
41

42
どのアプリケーションでも、最低二つのプロパティは構成しなければなりません。
43 44 45
すなわち、[[yii\base\Application::id|id]] と [[yii\base\Application::basePath|basePath]] です。


46
#### [[yii\base\Application::id|id]] <span id="id"></span>
47

48 49 50
[[yii\base\Application::id|id]] プロパティは、アプリケーションを他のアプリケーションから区別するユニークな ID を指定するものです。
このプロパティは主としてプログラム内部で使われます。
必須ではありませんが、最良の相互運用性を確保するために、アプリケーション ID を指定するときには英数字だけを使うことが推奨されます。
51 52


53
#### [[yii\base\Application::basePath|basePath]] <span id="basePath"></span>
54

55
[[yii\base\Application::basePath|basePath]] プロパティは、アプリケーションのルートディレクトリを指定するものです。
56 57 58 59 60 61 62 63 64 65 66 67 68 69
これは、アプリケーションシステムの全ての保護されたソースコードを収容するディレクトリです。
通常、このディレクトリの下に、MVC パターンに対応するソースコードを収容した `models``views``controllers` などのサブディレクトリがあります。

[[yii\base\Application::basePath|basePath]] プロパティの構成には、ディレクトリパスを使っても、[パスエイリアス](concept-aliases.md) を使っても構いません。
どちらの形式においても、対応するディレクトリが存在しなければなりません。
さもなくば、例外が投げられます。
パスは `realpath()` 関数を呼び出して正規化されます。

[[yii\base\Application::basePath|basePath]] プロパティは、しばしば、他の重要なパス (例えば、runtime のパス) を派生させるために使われます。
このため、`basePath` を示す `@app` というパスエイリアスが、あらかじめ定義されています。
その結果、派生的なパスはこのエイリアスを使って形成することが出来ます
(例えば、runtime ディレクトリを示す `@app/runtime` など)。


70
### 重要なプロパティ<span id="important-properties"></span>
71

72
この項で説明するプロパティは、アプリケーションごとに異なってくるものであるため、たいてい、構成する必要が生じます。
73 74


75
#### [[yii\base\Application::aliases|aliases]] <span id="aliases"></span>
76 77 78 79 80 81 82 83 84 85 86 87 88 89

このプロパティを使って、配列形式で一連の [エイリアス](concept-aliases.md) を定義することが出来ます。
配列のキーがエイリアスの名前であり、配列の値が対応するパスの定義です。
例えば、

```php
[
    'aliases' => [
        '@name1' => 'path/to/path1',
        '@name2' => 'path/to/path2',
    ],
]
```

90
このプロパティが提供されているのは、[[Yii::setAlias()]] メソッドを呼び出す代りに、アプリケーションの構成情報を使ってエイリアスを定義することが出来るようにするためです。
91 92


93
#### [[yii\base\Application::bootstrap|bootstrap]] <span id="bootstrap"></span>
94 95

これは非常に有用なプロパティです。
96
これによって、アプリケーションの [[yii\base\Application::bootstrap()|ブートストラップの過程]] において走らせるべきコンポーネントを配列として指定することが出来ます。
97
例えば、ある [モジュール](structure-modules.md)[URL 規則](runtime-routing.md) をカスタマイズさせたいときに、モジュールの ID をこのプロパティの要素として挙げることが出来ます。
98

99
このプロパティに挙げるコンポーネントは、それぞれ、以下の形式のいずれかによって指定することが出来ます。
100

101 102
- [components](#components) によって指定されているアプリケーションコンポーネントの ID。
- [modules](#modules) によって指定されているモジュールの ID。
103
- クラス名。
104
- 構成情報の配列。
105 106 107 108 109 110 111 112 113 114 115 116 117
- コンポーネントを作成して返す無名関数。

例えば、

```php
[
    'bootstrap' => [
        // アプリケーションコンポーネント ID、または、モジュール ID
        'demo',

        // クラス名
        'app\components\Profiler',

118
        // 構成情報の配列
119 120 121 122 123 124 125 126 127 128 129 130 131 132
        [
            'class' => 'app\components\Profiler',
            'level' => 3,
        ],

        // 無名関数
        function () {
            return new app\components\Profiler();
        }
    ],
]
```

> Info|情報: モジュール ID と同じ ID のアプリケーションコンポーネントがある場合は、ブートストラップの過程ではアプリケーションコンポーネントが使われます。
133
  代りにモジュールを使いたいときは、次のように、無名関数を使って指定することが出来ます。
Carsten Brandt committed
134
> ```php
135 136 137 138 139 140 141 142 143 144
[
    function () {
        return Yii::$app->getModule('user');
    },
]
```

ブートストラップの過程で、各コンポーネントのインスタンスが作成されます。
そして、コンポーネントクラスが [[yii\base\BootstrapInterface]] を実装している場合は、その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドも呼び出されます。

145
もう一つの実用的な例が [ベーシックアプリケーションテンプレート](start-installation.md) のアプリケーションの構成情報の中にあります。
146 147 148 149
そこでは、アプリケーションが開発環境で走るときには `debug` モジュールと `gii` モジュールがブートストラップコンポーネントとして構成されています。

```php
if (YII_ENV_DEV) {
150
    // 'dev' 環境のための構成情報の修正
151 152 153 154 155 156 157 158 159 160 161 162 163
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yii\gii\Module';
}
```

> Note|注意: あまり多くのコンポーネントを `bootstrap` に置くと、アプリケーションのパフォーマンスを劣化させます。
  なぜなら、リクエストごとに同じ一連のコンポーネントを走らせなければならないからです。
  ですから、ブートストラップコンポーネントは賢く使ってください。


164
#### [[yii\web\Application::catchAll|catchAll]] <span id="catchAll"></span>
165 166

このプロパティは [[yii\web\Application|ウェブアプリケーション]] においてのみサポートされます。
167
これは、全てのユーザリクエストを処理すべき [コントローラアクション](structure-controllers.md) を指定するものです。
168 169
これは主としてアプリケーションがメンテナンスモードにあって、入ってくる全てのリクエストを単一のアクションで処理する必要があるときに使われます。

170
構成情報は配列の形を取り、最初の要素はアクションのルートを指定します。
171 172 173 174 175 176 177 178 179 180 181 182 183 184
そして、配列の残りの要素 (キー・値のペア) は、アクションに渡されるパラメータを指定します。
例えば、

```php
[
    'catchAll' => [
        'offline/notice',
        'param1' => 'value1',
        'param2' => 'value2',
    ],
]
```


185
#### [[yii\base\Application::components|components]] <span id="components"></span>
186

187
これこそが、唯一の最も重要なプロパティです。
188
これによって、[アプリケーションコンポーネント](structure-application-components.md) と呼ばれる一連の名前付きのコンポーネントを登録して、それらを他の場所で使うことが出来るようになります。
189
例えば、
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204

```php
[
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
    ],
]
```

205
全てのアプリケーションコンポーネントは、それぞれ、配列の中で「キー・値」のペアとして指定されます。
206
キーはコンポーネントの ID を示し、値はコンポーネントのクラス名または [構成情報](concept-configurations.md) を示します。
207

208
どのようなコンポーネントでもアプリケーションに登録することが出来ます。
209
そして登録されたコンポーネントは、後で、`\Yii::$app->ComponentID` という式を使ってグローバルにアクセスすることが出来ます。
210

211
詳細は [アプリケーションコンポーネント](structure-application-components.md) の節を読んでください。
212 213


214
#### [[yii\base\Application::controllerMap|controllerMap]] <span id="controllerMap"></span>
215

216
このプロパティは、コントローラ ID を任意のコントローラクラスに割り付けることを可能にするものです。
217
デフォルトでは、Yii は [規約](#controllerNamespace) に基づいてコントローラ ID をコントローラクラスに割り付けます
218 219
(例えば、`post` という ID は `app\controllers\PostController` に割り付けられます)。
このプロパティを構成することによって、特定のコントローラに対する規約を破ることが出来ます。
220
下記の例では、`account` は `app\controllers\UserController` に割り付けられ、`article` は `app\controllers\PostController` に割り付けられることになります。
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235

```php
[
    'controllerMap' => [
        [
            'account' => 'app\controllers\UserController',
            'article' => [
                'class' => 'app\controllers\PostController',
                'enableCsrfValidation' => false,
            ],
        ],
    ],
]
```

236
このプロパティの配列のキーはコントローラ ID を表し、配列の値は対応するコントローラクラスの名前または [構成情報](concept-configurations.md) を表します。
237 238


239
#### [[yii\base\Application::controllerNamespace|controllerNamespace]] <span id="controllerNamespace"></span>
240

241
このプロパティは、コントローラクラスが配置されるべきデフォルトの名前空間を指定するものです。
242
デフォルト値は `app\controllers` です。
243
コントローラ ID が `post` である場合、規約によって対応するコントローラの (名前空間を略した) クラス名は `PostController` となり、完全修飾クラス名は `app\controllers\PostController` となります。
244

245 246
コントローラクラスは、この名前空間に対応するディレクトリのサブディレクトリに配置されても構いません。
例えば、コントローラ ID として `admin/post` を仮定すると、対応するコントローラの完全修飾クラス名は `app\controllers\admin\PostController` となります。
247

248
重要なことは、完全修飾されたコントローラクラスが [オートロード可能](concept-autoloading.md) でなければならず、コントローラクラスの実際の名前空間がこのプロパティと合致していなければならない、ということです。
249
そうでないと、アプリケーションにアクセスしたときに "ページがみつかりません" というエラーを受け取ることになります。
250

251
上で説明された規約を破りたい場合は、[controllerMap](#controllerMap) プロパティを構成することが出来ます。
252 253


254
#### [[yii\base\Application::language|language]] <span id="language"></span>
255

256
このプロパティは、アプリケーションがコンテントをエンドユーザに表示するときに使うべき言語を指定するものです。
257
このプロパティのデフォルト値は `en` であり、英語を意味します。
258
アプリケーションが多言語をサポートする必要があるときは、このプロパティを構成しなければなりません。
259

260
このプロパティの値が、メッセージの翻訳、日付の書式、数字の書式などを含む [国際化](tutorial-i18n.md) のさまざまな側面を決定します。
261
例えば、[[yii\jui\DatePicker]] ウィジェットは、どの言語でカレンダーを表示すべきか、そして日付をどのように書式設定すべきかを、デフォルトでは、このプロパティを使用して決定します。
262

263 264
言語を指定するのには、[IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従うことが推奨されます。
例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。
265

266
このプロパティに関する詳細は [国際化](tutorial-i18n.md) の節で読むことが出来ます。
267 268


269
#### [[yii\base\Application::modules|modules]] <span id="modules"></span>
270

271
このプロパティはアプリケーションが含む [モジュール](structure-modules.md) を指定するものです。
272

273 274
このプロパティは、モジュールの ID をキーとする、モジュールのクラスまたは [構成情報](concept-configurations.md) の配列です。
例えば、
275 276 277 278

```php
[
    'modules' => [
279
        // モジュールクラスで指定された "booking" モジュール
280 281
        'booking' => 'app\modules\booking\BookingModule',

282
        // 構成情報の配列で指定された "comment" モジュール
283 284 285 286 287 288 289 290
        'comment' => [
            'class' => 'app\modules\comment\CommentModule',
            'db' => 'db',
        ],
    ],
]
```

291
詳細は [モジュール](structure-modules.md) の節を参照してください。
292 293


294
#### [[yii\base\Application::name|name]] <span id="name"></span>
295

296 297
このプロパティは、エンドユーザに対して表示されるアプリケーション名を指定するものです。
[[yii\base\Application::id|id]] プロパティがユニークな値を取らなければならないのとは違って、このプロパティの値は主として表示目的であり、ユニークである必要はありません。
298

299
コードのどこにも使わないのであれば、このプロパティは必ずしも構成する必要はありません。
300 301


302
#### [[yii\base\Application::params|params]] <span id="params"></span>
303

304
このプロパティは、グローバルにアクセス可能なアプリケーションパラメータの配列を指定するものです。
305
コードの中のいたる処でハードコードされた数値や文字列を使う代りに、それらをアプリケーションパラメータとして一ヶ所で定義し、必要な場所ではそのパラメータを使うというのが良いプラクティスです。
306
例えば、次のように、サムネール画像のサイズをパラメータとして定義することが出来ます。
307 308 309 310 311 312 313 314 315

```php
[
    'params' => [
        'thumbnail.size' => [128, 128],
    ],
]
```

316
そして、このサイズの値を使う必要があるコードにおいては、下記のようなコードを使うだけで済ませることが出来ます。
317 318 319 320 321 322

```php
$size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0];
```

323
後でサムネールのサイズを変更すると決めたときは、アプリケーションの構成情報においてのみサイズを修正すればよく、これに依存するコードには少しも触れる必要がありません。
324 325


326
#### [[yii\base\Application::sourceLanguage|sourceLanguage]] <span id="sourceLanguage"></span>
327

328 329 330
このプロパティはアプリケーションコードが書かれている言語を指定するものです。
デフォルト値は `'en-US'`、アメリカ合衆国の英語です。
あなたのコードのテキストのコンテントが英語以外で書かれているときは、このプロパティを構成しなければなりません。
331

332
[language](#language) プロパティと同様に、このプロパティは [IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従って構成しなければなりません。
333
例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。
334

335
このプロパティに関する詳細は [国際化](tutorial-i18n.md) の節で読むことが出来ます。
336 337


338
#### [[yii\base\Application::timeZone|timeZone]] <span id="timeZone"></span>
339

340
このプロパティは、PHP ランタイムのデフォルトタイムゾーンを設定する代替手段として提供されています。
341
このプロパティを構成することによって、本質的には PHP 関数 [date_default_timezone_set()](http://php.net/manual/ja/function.date-default-timezone-set.php) を呼び出すことになります。
342
例えば、
343 344 345

```php
[
346
    'timeZone' => 'Asia/Tokyo',
347 348 349 350
]
```


351
#### [[yii\base\Application::version|version]] <span id="version"></span>
352

353 354
このプロパティはアプリケーションのバージョンを指定するものです。デフォルト値は `'1.0'` です。
コードの中で全く使わないのであれば、必ずしも構成する必要はありません。
355 356


357
### 有用なプロパティ <span id="useful-properties"></span>
358

359
この項で説明されるプロパティは通常は構成されません。というのは、そのデフォルト値が通常の規約を指定しているからです。
360
しかしながら、規約を破る必要がある場合には、これらのプロパティを構成することが出来ます。
361 362


363
#### [[yii\base\Application::charset|charset]] <span id="charset"></span>
364

365 366
このプロパティはアプリケーションが使う文字セットを指定するものです。
デフォルト値は `'UTF-8'` であり、あなたのアプリケーションが多数の非ユニコードデータを使うレガシーシステムと連携するのでなければ、たいていのアプリケーションでは、そのままにしておくべきです。
367 368


369
#### [[yii\base\Application::defaultRoute|defaultRoute]] <span id="defaultRoute"></span>
370

371
このプロパティは、リクエストがルートを指定していないときにアプリケーションが使用すべき [ルート](runtime-routing.md) を指定するものです。
372 373
ルートは、チャイルドモジュール ID、コントローラ ID、および/または アクション ID を構成要素とすることが出来ます。
例えば、`help`、`post/create`、`admin/post/create` などです。
374
アクション ID が与えられていない場合は、[[yii\base\Controller::defaultAction]] で指定されるデフォルト値を取ります。
375

376 377
[[yii\web\Application|ウェブアプリケーション]] では、このプロパティのデフォルト値は `'site'` であり、その意味するところは、`SiteController` コントローラとそのデフォルトアクションが使用されるべきである、ということです。
結果として、ルートを指定せずにアプリケーションにアクセスすると、`app\controllers\SiteController::actionIndex()` の結果が表示されます。
378

379
[[yii\console\Application|コンソールアプリケーション]] では、デフォルト値は `'help'` であり、コアコマンドの [[yii\console\controllers\HelpController::actionIndex()]] が使用されるべきであるという意味です。
380
結果として、何も引数を与えずに `yii` というコマンドを実行すると、ヘルプ情報が表示されることになります。
381 382


383
#### [[yii\base\Application::extensions|extensions]] <span id="extensions"></span>
384

385
このプロパティは、アプリケーションにインストールされて使われている [エクステンション](structure-extensions.md) のリストを指定するものです。
386 387 388
デフォルトでは、`@vendor/yiisoft/extensions.php` というファイルによって返される配列を取ります。
`extensions.php` は、[Composer](http://getcomposer.org) を使ってエクステンションをインストールすると、自動的に生成され保守されます。
ですから、たいていの場合、このプロパティをあなたが構成する必要はありません。
389

390
エクステンションを手作業で保守したいという特殊なケースにおいては、次のようにしてこのプロパティを構成することが出来ます。
391 392 393 394 395 396 397

```php
[
    'extensions' => [
        [
            'name' => 'extension name',
            'version' => 'version number',
398
            'bootstrap' => 'BootstrapClassName',  // オプション、構成情報の配列でもよい
399 400 401 402 403 404
            'alias' => [  // optional
                '@alias1' => 'to/path1',
                '@alias2' => 'to/path2',
            ],
        ],

405
        // ... 上記と同じように、更にエクステンションを構成 ...
406 407 408 409 410

    ],
]
```

411 412 413 414
ご覧のように、このプロパティはエクステンションの仕様を示す配列を取ります。
それぞれのエクステンションは、`name` と `version` の要素を含む配列によって指定されます。
エクステンションが [ブートストラップ](runtime-bootstrapping.md) の過程で走る必要がある場合には、`bootstrap` 要素をブートストラップのクラス名または [構成情報](concept-configurations.md) の配列によって指定することが出来ます。
また、エクステンションはいくつかの [エイリアス](concept-aliases.md) を定義することも出来ます。
415 416


417
#### [[yii\base\Application::layout|layout]] <span id="layout"></span>
418

419 420 421
このプロパティは、[ビュー](structure-views.md) をレンダリングするときに使われるべきデフォルトのレイアウトを指定するものです。
デフォルト値は `'main'` であり、[レイアウトパス](#layoutPath) の下にある `main.php` というファイルが使われるべきことを意味します。
[レイアウトパス](#layoutPath) と [ビューパス](#viewPath) の両方がデフォルト値を取る場合、デフォルトのレイアウトファイルは `@app/views/layouts/main.php` というパスエイリアスとして表すことが出来ます。
422

423
滅多には無いことですが、レイアウトをデフォルトで無効にしたい場合は、このプロパティを `false` として構成することが出来ます。
424 425


426
#### [[yii\base\Application::layoutPath|layoutPath]] <span id="layoutPath"></span>
427

428
このプロパティは、レイアウトファイルが捜されるべきパスを指定するものです。
429 430
デフォルト値は、[ビューパス](#viewPath) の下の `layouts` サブディレクトリです。
[ビューパス](#viewPath) がデフォルト値を取る場合、デフォルトのレイアウトパスは `@app/views/layouts` というパスエイリアスとして表すことが出来ます。
431

432
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
433 434


435
#### [[yii\base\Application::runtimePath|runtimePath]] <span id="runtimePath"></span>
436

437
このプロパティは、ログファイルやキャッシュファイルなどの一時的ファイルを生成することが出来るパスを指定するものです。
438
デフォルト値は、`@app/runtime` というエイリアスで表現されるディレクトリです。
439

440
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
441 442
ランタイムパスは、アプリケーションを実行するプロセスによって書き込みが可能なものでなければならないことに注意してください。
そして、この下にある一時的ファイルは秘匿を要する情報を含みうるものですので、ランタイムパスはエンドユーザによるアクセスから保護されなければなりません。
443

444
このパスに簡単にアクセスできるように、Yii は `@runtime` というパスエイリアスを事前に定義しています。
445 446


447
#### [[yii\base\Application::viewPath|viewPath]] <span id="viewPath"></span>
448

449
このプロパティはビューファイルが配置されるルートディレクトリを指定するものです。
450 451
デフォルト値は、`@app/views` というエイリアスで表現されるディレクトリです。
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
452 453


454
#### [[yii\base\Application::vendorPath|vendorPath]] <span id="vendorPath"></span>
455

456
このプロパティは、[Composer](http://getcomposer.org) によって管理される vendor ディレクトリを指定するものです。
457 458
Yii フレームワークを含めて、あなたのアプリケーションによって使われる全てのサードパーティライブラリを格納するディレクトリです。
デフォルト値は、`@app/vendor` というエイリアスで表現されるディレクトリです。
459

460
このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。
461
このプロパティを修正するときは、必ず、Composer の構成もそれに合せて修正してください。
462

463
このパスに簡単にアクセスできるように、Yii は `@vendor` というパスエイリアスを事前に定義しています。
464 465


466
#### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] <span id="enableCoreCommands"></span>
467

468
このプロパティは [[yii\console\Application|コンソールアプリケーション]] においてのみサポートされています。
469
Yii リリースに含まれているコアコマンドを有効にすべきか否かを指定するものです。デフォルト値は `true` です。
470 471


472
## アプリケーションのイベント <span id="application-events"></span>
473

Nobuo Kihara committed
474
アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントをトリガします。
475
これらのイベントに対して、下記のようにして、アプリケーションの構成情報の中でイベントハンドラをアタッチすることが出来ます。
476 477 478 479 480 481 482 483 484

```php
[
    'on beforeRequest' => function ($event) {
        // ...
    },
]
```

485
`on eventName` という構文の使い方については、[構成情報](concept-configurations.md#configuration-format) の節で説明されています。
486

487
別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベントハンドラをアタッチすることも出来ます。
488
例えば、
489 490 491 492 493 494 495

```php
\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
    // ...
});
```

496
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] <span id="beforeRequest"></span>
497

Nobuo Kihara committed
498
このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。
499
実際のイベント名は `beforeRequest` です。
500

Nobuo Kihara committed
501 502
このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。
ですから、イベントメカニズムを使って、リクエスト処理のプロセスに干渉するカスタムコードを挿入するのには、ちょうど良い場所です。
Nobuo Kihara committed
503
例えば、このイベントハンドラの中で、何らかのパラメータに基づいて [[yii\base\Application::language]] プロパティを動的にセットすることが出来ます。
504 505


506
### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] <span id="afterRequest"></span>
507

Nobuo Kihara committed
508
このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* にトリガされます。
509
実際のイベント名は `afterRequest` です。
510

Nobuo Kihara committed
511
このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。
512

513
[[yii\web\Response|response]] コンポーネントも、エンドユーザにレスポンスのコンテントを送出する間にいくつかのイベントをトリガすることに注意してください。
Nobuo Kihara committed
514
それらのイベントは、このイベントの *後* にトリガされます。
515 516


517
### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] <span id="beforeAction"></span>
518

519
このイベントは、[コントローラアクション](structure-controllers.md) を実行する *前* に毎回トリガされます。
520
実際のイベント名は `beforeAction` です。
521

522
イベントのパラメータは [[yii\base\ActionEvent]] のインスタンスです。
523
イベントハンドラは、[[yii\base\ActionEvent::isValid]] プロパティを `false` にセットして、アクションの実行を中止することが出来ます。
524
例えば、
525 526 527 528

```php
[
    'on beforeAction' => function ($event) {
529
        if (何らかの条件) {
530 531 532 533 534 535 536
            $event->isValid = false;
        } else {
        }
    },
]
```

537
同じ `beforeAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) からもトリガされることに注意してください。
Nobuo Kihara committed
538 539
アプリケーションオブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントをトリガします。
イベントハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。
540 541


542
### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] <span id="afterAction"></span>
543

544
このイベントは、[コントローラアクション](structure-controllers.md) を実行した *後* に毎回トリガされます。
545
実際のイベント名は `afterAction` です。
546

547 548 549
イベントのパラメータは [[yii\base\ActionEvent]] のインスタンスです。
[[yii\base\ActionEvent::result]] プロパティを通じて、イベントハンドラはアクションの結果にアクセスしたり、またはアクションの結果を修正したり出来ます。
例えば、
550 551 552 553

```php
[
    'on afterAction' => function ($event) {
554
        if (何らかの条件) {
555
            // $event->result を修正する
556 557 558 559 560 561
        } else {
        }
    },
]
```

562
同じ `afterAction` イベントが、[モジュール](structure-modules.md)[コントローラ](structure-controllers.md) からもトリガされることに注意してください。
Nobuo Kihara committed
563 564
これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントをトリガします。
すなわち、コントローラオブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントをトリガします。
565 566


567
## アプリケーションのライフサイクル<span id="application-lifecycle"></span>
568

569 570
![アプリケーションのライフサイクル](images/application-lifecycle.png)

571
[エントリスクリプト](structure-entry-scripts.md) が実行されて、リクエストが処理されるとき、アプリケーションは次のようなライフサイクルを経ます。
572

573 574
1. エントリスクリプトがアプリケーションの構成情報を配列として読み出す。
2. エントリスクリプトがアプリケーションの新しいインスタンスを作成する。
575
  * [[yii\base\Application::preInit()|preInit()]] が呼び出されて、[[yii\base\Application::basePath|basePath]] のような、優先度の高いアプリケーションプロパティを構成する。
576 577
  * [[yii\base\Application::errorHandler|エラーハンドラ]] を登録する。
  * アプリケーションのプロパティを構成する。
578
  * [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップコンポーネントを走らせるために、[[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。
579
3. エントリスクリプトが [[yii\base\Application::run()]] を呼んで、アプリケーションを走らせる。
Nobuo Kihara committed
580
  * [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントをトリガする。
581 582 583
  * リクエストを処理する: リクエストを [ルート](runtime-routing.md) とそれに結び付くパラメータとして解決する。
    ルートによって指定されたモジュール、コントローラ、および、アクションを作成する。
    そしてアクションを実行する。
Nobuo Kihara committed
584
  * [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントをトリガする。
585 586
  * エンドユーザにレスポンスを送信する。
4. エントリスクリプトがアプリケーションから終了ステータスを受け取り、リクエストの処理を完了する。