Commit 4a53d0ca by Nobuo Kihara Committed by Carsten Brandt

docs/guide-ja/runtime revised [ci skip]

close #6341
parent 53f1cb61
ブートストラップ ブートストラップ
================ ================
ブートストラップとは、アプリケーションが入ってくるリクエストの解決と処理を開始する前の、 ブートストラップとは、アプリケーションが入ってくるリクエストの解決と処理を開始する前の、環境を準備する過程を指すものです。
環境を準備する過程を指すものです。ブートストラップは二つの場所、すなわち、[エントリスクリプト](structure-entry-scripts.md) ブートストラップは二つの場所、すなわち、[エントリスクリプト](structure-entry-scripts.md)[アプリケーション](structure-applications.md)で行われます。
[アプリケーション](structure-applications.md)で行われます。
[エントリスクリプト](structure-entry-scripts.md) では、さまざまなライブラリのためのクラスオートローダが登録されます。 [エントリスクリプト](structure-entry-scripts.md) では、さまざまなライブラリのためのクラスオートローダが登録されます。
この中には、Composer の `autoload.php` によるオートローダと、 この中には、Composer の `autoload.php` によるオートローダと、Yii の `Yii` クラスファイルによるオートローダが含まれます。
Yii の `Yii` クラスファイルによるオートローダが含まれます。 エントリスクリプトは、次に、アプリケーションの [構成情報](concept-configurations.md) をロードして、[アプリケーション](structure-applications.md) のインスタンスを作成します。
エントリスクリプトは、次に、アプリケーションの [コンフィギュレーション](concept-configurations.md)
をロードして、[アプリケーション](structure-applications.md) のインスタンスを作成します。
アプリケーションのコンストラクタでは、次のようなブートストラップの仕事が行われます。 アプリケーションのコンストラクタでは、次のようなブートストラップの仕事が行われます。
1. [[yii\base\Application::preInit()|preInit()]] が呼ばれます。このメソッドは、いくつかの 1. [[yii\base\Application::preInit()|preInit()]] が呼ばれます。
優先度の高いアプリケーションプロパティ、例えば [[yii\base\Application::basePath|basePath]] このメソッドは、いくつかの優先度の高いアプリケーションプロパティ、例えば [[yii\base\Application::basePath|basePath]] などを構成します。
などを構成します。
2. [[yii\base\Application::errorHandler|エラーハンドラ]] を登録します。 2. [[yii\base\Application::errorHandler|エラーハンドラ]] を登録します。
3. 与えられたアプリケーションコンフィギュレーションを使って、アプリケーションプロパティを初期化します。 3. 与えられたアプリケーションの構成情報を使って、アプリケーションのプロパティを初期化します。
4. [[yii\base\Application::init()|init()]] が呼ばれます。そして `init()`[[yii\base\Application::bootstrap()|bootstrap()]] を呼んで、 4. [[yii\base\Application::init()|init()]] が呼ばれます。
ブートストラップコンポーネントを走らせます。 そして `init()`[[yii\base\Application::bootstrap()|bootstrap()]] を呼んで、ブートストラップコンポーネントを走らせます。
- エクステンションマニフェストファイル `vendor/yiisoft/extensions.php` をインクルードします。 - エクステンションマニフェストファイル `vendor/yiisoft/extensions.php` をインクルードします。
- エクステンションによって宣言された [ブートストラップコンポーネント](structure-extensions.md#bootstrapping-classes) を作成して走らせます。 - エクステンションによって宣言された [ブートストラップコンポーネント](structure-extensions.md#bootstrapping-classes) を作成して走らせます。
- アプリケーションの [bootstrap プロパティ](structure-applications.md#bootstrap) に宣言されている - アプリケーションの [bootstrap プロパティ](structure-applications.md#bootstrap) に宣言されている
[アプリケーションコンポーネント](structure-application-components.md) および/または [アプリケーションコンポーネント](structure-application-components.md) および/または
[モジュール](structure-modules.md) を作成して走らせます。 [モジュール](structure-modules.md) を作成して走らせます。
ブートストラップの仕事は *全て* のリクエストを処理する前に、毎回しなければなりませんので、この過程を ブートストラップの仕事は *全て* のリクエストを処理する前に、毎回しなければなりませんので、この過程を軽いものに保って可能な限り最適化することは非常に重要なことです。
軽いものに保って可能な限り最適化することは非常に重要なことです。
あまりに多くのブートストラップコンポーネントを登録しないように努めてください。ブートストラップ あまりに多くのブートストラップコンポーネントを登録しないように努めてください。
コンポーネントが必要になるのは、リクエスト処理のライフサイクル全体に関与する必要がある場合だけです。 ブートストラップコンポーネントが必要になるのは、リクエスト処理のライフサイクル全体に関与する必要がある場合だけです。
例えば、モジュールが追加の URL 解析規則を登録する必要がある場合は、モジュールを [bootstrap プロパティ](structure-applications.md#bootstrap) 例えば、モジュールが追加の URL 解析規則を登録する必要がある場合は、モジュールを [bootstrap プロパティ](structure-applications.md#bootstrap) のリストに挙げなければなりません。
のリストに挙げなければなりません。なぜなら、URL 規則を使ってリクエストが解決される前に、 なぜなら、URL 規則を使ってリクエストが解決される前に、新しい URL 規則を有効にしなければならないからです。
新しい URL 規則を有効にしなければならないからです。
実運用モードにおいては、[PHP OPCache][APC] など、バイトコードキャッシュを有効にして、PHP ファイルを 実運用モードにおいては、[PHP OPCache][APC] など、バイトコードキャッシュを有効にして、PHP ファイルをインクルードして解析するのに要する時間を最小化してください。
インクルードして解析するのに要する時間を最小化してください。
[PHP OPcache]: http://php.net/manual/ja/book.opcache.php [PHP OPcache]: http://php.net/manual/ja/book.opcache.php
[APC]: http://php.net/manual/ja/book.apc.php [APC]: http://php.net/manual/ja/book.apc.php
大規模なアプリケーションには、多数の小さなコンフィギュレーションファイルに分割された、 大規模なアプリケーションには、多数の小さな構成情報ファイルに分割された、非常に複雑なアプリケーション [構成情報](concept-configurations.md) を持つものがあります。
非常に複雑なアプリケーション [コンフィギュレーション](concept-configurations.md) を持つものがあります。 そのような場合には、構成情報配列全体をキャッシュしておき、エントリスクリプトでアプリケーションのインスタンスを作成する前には、構成情報配列をキャッシュからロードするという方法を考慮してください。
そのような場合には、コンフィギュレーション配列全体をキャッシュしておき、エントリスクリプトでアプリケーションのインスタンスを作成する前には、コンフィギュレーション配列をキャッシュからロードするという方法を考慮してください。
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
Yii のアプリケーションがリクエストを処理するときは、毎回、同じような作業の流れを経験します。 Yii のアプリケーションがリクエストを処理するときは、毎回、同じような作業の流れを経験します。
1. ユーザが [エントリスクリプト](structure-entry-scripts.md) `web/index.php` にリクエストをします。 1. ユーザが [エントリスクリプト](structure-entry-scripts.md) `web/index.php` にリクエストをします。
2. エントリスクリプトは、アプリケーションの [コンフィギュレーション](concept-configurations.md) をロードして、リクエストを処理するための [アプリケーション](structure-applications.md) のインスタンスを作成します。 2. エントリスクリプトは、アプリケーションの [構成情報](concept-configurations.md) をロードして、リクエストを処理するための [アプリケーション](structure-applications.md) のインスタンスを作成します。
3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーションコンポーネントの助けを借りて、リクエストされた [ルート](runtime-routing.md) を解決します。 3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーションコンポーネントの助けを借りて、リクエストされた [ルート](runtime-routing.md) を解決します。
4. アプリケーションはリクエストを処理するための [コントローラ](structure-controllers.md) のインスタンスを作成します。 4. アプリケーションはリクエストを処理するための [コントローラ](structure-controllers.md) のインスタンスを作成します。
5. コントローラは [アクション](structure-controllers.md) のインスタンスを作成して、アクションのためのフィルタを実行します。 5. コントローラは [アクション](structure-controllers.md) のインスタンスを作成して、アクションのためのフィルタを実行します。
......
リクエスト リクエスト
========== ==========
アプリケーションに対するリクエストは、リクエストのパラメータ、HTTP ヘッダ、クッキーなどの情報を提供する [[yii\web\Request]] アプリケーションに対するリクエストは、リクエストのパラメータ、HTTP ヘッダ、クッキーなどの情報を提供する [[yii\web\Request]] オブジェクトの形で表されます。
オブジェクトの形で表されます。与えられたリクエストに対応するリクエストオブジェクトには、 与えられたリクエストに対応するリクエストオブジェクトには、既定では [[yii\web\Request]] のインスタンスである `request` [アプリケーションコンポーネント](structure-application-components.md) を通じてアクセスすることが出来ます。
既定では [[yii\web\Request]] のインスタンスである `request` [アプリケーションコンポーネント](structure-application-components.md) この節では、アプリケーションの中でこのコンポーネントをどのように利用できるかを説明します。
を通じてアクセスすることが出来ます。この節では、アプリケーションの中でこのコンポーネントをどのように利用できるかを説明します。
## リクエストのパラメータ <a name="request-parameters"></a> ## リクエストのパラメータ <a name="request-parameters"></a>
リクエストのパラメータを取得するためには、`request` コンポーネントの [[yii\web\Request::get()|get()]] および リクエストのパラメータを取得するためには、`request` コンポーネントの [[yii\web\Request::get()|get()]] および [[yii\web\Request::post()|post()]] メソッドを呼ぶことが出来ます。
[[yii\web\Request::post()|post()]] メソッドを呼ぶことが出来ます。これらは、ぞれぞれ、`$_GET``$_POST` の値を返します。例えば、 これらは、ぞれぞれ、`$_GET``$_POST` の値を返します。例えば、
```php ```php
$request = Yii::$app->request; $request = Yii::$app->request;
...@@ -34,13 +33,12 @@ $name = $request->post('name', ''); ...@@ -34,13 +33,12 @@ $name = $request->post('name', '');
// $name = isset($_POST['name']) ? $_POST['name'] : ''; と同等 // $name = isset($_POST['name']) ? $_POST['name'] : ''; と同等
``` ```
> Info|情報: 直接に `$_GET` と `$_POST` にアクセスしてリクエストのパラメータを読み出す代りに、上記に示されているように > Info|情報: 直接に `$_GET` と `$_POST` にアクセスしてリクエストのパラメータを読み出す代りに、上記に示されているように、`request` コンポーネントを通じてそれらを取得することが推奨されます。
`request` コンポーネントを通じてそれらを取得することが推奨されます。このようにすると、ダミーのリクエストデータを持った このようにすると、ダミーのリクエストデータを持った模擬リクエストコンポーネントを作ることが出来るため、テストを書くことがより容易になります。
模擬リクエストコンポーネントを作ることが出来るため、テストを書くことがより容易になります。
[RESTful API](rest-quick-start.md) を実装するときは、PUT、PATCH またはその他の [リクエストメソッド](#request-methods) [RESTful API](rest-quick-start.md) を実装するときは、PUT、PATCH またはその他の [リクエストメソッド](#request-methods) によって送信されたパラメータを読み出さなければならないことがよくあります。
によって送信されたパラメータを読み出さなければならないことがよくあります。そういうパラメータは [[yii\web\Request::getBodyParam()]] そういうパラメータは [[yii\web\Request::getBodyParam()]] メソッドを呼ぶことで取得することが出来ます。
メソッドを呼ぶことで取得することが出来ます。例えば、 例えば、
```php ```php
$request = Yii::$app->request; $request = Yii::$app->request;
...@@ -76,8 +74,7 @@ if ($request->isPut) { // リクエストメソッドは PUT } ...@@ -76,8 +74,7 @@ if ($request->isPut) { // リクエストメソッドは PUT }
`request` コンポーネントは現在リクエストされている URL を調べるための方法を数多く提供しています。 `request` コンポーネントは現在リクエストされている URL を調べるための方法を数多く提供しています。
リクエストされた URL が `http://example.com/admin/index.php/product?id=100` であると仮定したとき、 リクエストされた URL が `http://example.com/admin/index.php/product?id=100` であると仮定したとき、次にまとめたように、この URL のさまざまな部分を取得することが出来ます。
次にまとめたように、この URL のさまざまな部分を取得することが出来ます。
* [[yii\web\Request::url|url]]: `/admin/index.php/product?id=100` を返します。ホスト情報の部分を省略した URL です。 * [[yii\web\Request::url|url]]: `/admin/index.php/product?id=100` を返します。ホスト情報の部分を省略した URL です。
* [[yii\web\Request::absoluteUrl|absoluteUrl]]: `http://example.com/admin/index.php/product?id=100` を返します。 * [[yii\web\Request::absoluteUrl|absoluteUrl]]: `http://example.com/admin/index.php/product?id=100` を返します。
...@@ -93,8 +90,7 @@ if ($request->isPut) { // リクエストメソッドは PUT } ...@@ -93,8 +90,7 @@ if ($request->isPut) { // リクエストメソッドは PUT }
## HTTP ヘッダ <a name="http-headers"></a> ## HTTP ヘッダ <a name="http-headers"></a>
[[yii\web\Request::headers]] プロパティによって返される [[yii\web\HeaderCollection|header コレクション]] [[yii\web\Request::headers]] プロパティによって返される [[yii\web\HeaderCollection|header コレクション]] を通じて、HTTP ヘッダ情報を取得することが出来ます。例えば、
を通じて、HTTP ヘッダ情報を取得することが出来ます。例えば、
```php ```php
// $headers は yii\web\HeaderCollection のオブジェクト // $headers は yii\web\HeaderCollection のオブジェクト
...@@ -106,7 +102,8 @@ $accept = $headers->get('Accept'); ...@@ -106,7 +102,8 @@ $accept = $headers->get('Accept');
if ($headers->has('User-Agent')) { // User-Agent ヘッダが在る } if ($headers->has('User-Agent')) { // User-Agent ヘッダが在る }
``` ```
`request` コンポーネントは、よく使用されるいくつかのヘッダにすばやくアクセスする方法を提供しています。その中には下記のものが含まれます。 `request` コンポーネントは、よく使用されるいくつかのヘッダにすばやくアクセスする方法を提供しています。
その中には下記のものが含まれます。
* [[yii\web\Request::userAgent|userAgent]]: `User-Agent` ヘッダの値を返します。 * [[yii\web\Request::userAgent|userAgent]]: `User-Agent` ヘッダの値を返します。
* [[yii\web\Request::contentType|contentType]]: リクエストボディのデータの MIME タイプを示す `Content-Type` ヘッダの値を返します。 * [[yii\web\Request::contentType|contentType]]: リクエストボディのデータの MIME タイプを示す `Content-Type` ヘッダの値を返します。
...@@ -115,20 +112,16 @@ if ($headers->has('User-Agent')) { // User-Agent ヘッダが在る } ...@@ -115,20 +112,16 @@ if ($headers->has('User-Agent')) { // User-Agent ヘッダが在る }
* [[yii\web\Request::acceptableLanguages|acceptableLanguages]]: ユーザが受け入れ可能な言語を返します。 * [[yii\web\Request::acceptableLanguages|acceptableLanguages]]: ユーザが受け入れ可能な言語を返します。
返される言語は優先レベルによって順序付けられます。最初の要素が最も優先度の高い言語を表します。 返される言語は優先レベルによって順序付けられます。最初の要素が最も優先度の高い言語を表します。
あなたのアプリケーションが複数の言語をサポートしており、エンドユーザが最も優先する言語でページを表示したいと思う場合は、 あなたのアプリケーションが複数の言語をサポートしており、エンドユーザが最も優先する言語でページを表示したいと思う場合は、言語ネゴシエーションメソッド [[yii\web\Request::getPreferredLanguage()]] を使うことが出来ます。
言語ネゴシエーションメソッド [[yii\web\Request::getPreferredLanguage()]] を使うことが出来ます。 このメソッドはアプリケーションによってサポートされている言語のリストを引数として取り、 [[yii\web\Request::acceptableLanguages|acceptableLanguages]] と比較して、最も適切な言語を返します。
このメソッドはアプリケーションによってサポートされている言語のリストを引数として取り、 [[yii\web\Request::acceptableLanguages|acceptableLanguages]]
と比較して、最も適切な言語を返します。
> Tip|ヒント: [[yii\filters\ContentNegotiator|ContentNegotiator]] フィルタを使用して、レスポンスにおいて > Tip|ヒント: [[yii\filters\ContentNegotiator|ContentNegotiator]] フィルタを使用して、レスポンスにおいてどのコンテントタイプと言語を使うべきかを動的に決定することも出来ます。
どのコンテントタイプと言語を使うべきかを動的に決定することも出来ます。このフィルタは、上記で説明したプロパティとメソッドの上に、 このフィルタは、上記で説明したプロパティとメソッドの上に、コンテントネゴシエーションを実装しています。
コンテントネゴシエーションを実装しています。
## クライアント情報 <a name="client-information"></a> ## クライアント情報 <a name="client-information"></a>
クライアントマシンのホスト名と IP アドレスを、それぞれ、[[yii\web\Request::userHost|userHost]] と クライアントマシンのホスト名と IP アドレスを、それぞれ、[[yii\web\Request::userHost|userHost]] と [[yii\web\Request::userIP|userIP]] によって取得することが出来ます。例えば、
[[yii\web\Request::userIP|userIP]] によって取得することが出来ます。例えば、
```php ```php
$userHost = Yii::$app->request->userHost; $userHost = Yii::$app->request->userHost;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment