|
|
|
@ -6,12 +6,11 @@ Yii のアプリケーションがリクエストされた URL の処理を開
|
|
|
|
|
このプロセスの全体が *ルーティング* と呼ばれます。 |
|
|
|
|
|
|
|
|
|
ルーティングの逆のプロセスが *URL 生成* と呼ばれます。 |
|
|
|
|
これは、与えられたルートとそれに結び付いたクエリパラメータからURL を生成するものです。 |
|
|
|
|
生成された URL が後でリクエストされたとき、ルーティングのプロセスは、その URL を解決して、元のルートとクエリパラメータに戻すことが出来ます。 |
|
|
|
|
これは、与えられたルートとそれに結び付けられたクエリパラメータから URL を生成するものです。 |
|
|
|
|
生成された URL が後でリクエストされたときには、ルーティングのプロセスがその URL を解決して元のルートとクエリパラメータに戻すことが出来ます。 |
|
|
|
|
|
|
|
|
|
ルーティングと URL 生成について責任を持つ主要コンポーネントが [[yii\web\UrlManager|URL マネージャ]] であり、`urlManager` アプリケーションコンポーネントとして登録されているものです。 |
|
|
|
|
[[yii\web\UrlManager|URL マネージャ]] は、入ってくるリクエストをルートとそれに結び付いたクエリパラメータとして解析するための [[yii\web\UrlManager::parseRequest()|parseRequest()]] メソッドと、 |
|
|
|
|
与えられたルートとそれに結び付いたクエリパラメータから URL を生成するための [[yii\web\UrlManager::createUrl()|createUrl()]] メソッドを提供するものです。 |
|
|
|
|
ルーティングと URL 生成について主たる役割を果たすのが `urlManager` アプリケーションコンポーネントとして登録されている [[yii\web\UrlManager|URL マネージャ]] です。 |
|
|
|
|
[[yii\web\UrlManager|URL マネージャ]] は、入ってくるリクエストをルートとそれに結び付けられたクエリパラメータとして解析するための [[yii\web\UrlManager::parseRequest()|parseRequest()]] メソッドと、与えられたルートとそれに結び付けられたクエリパラメータから URL を生成するための [[yii\web\UrlManager::createUrl()|createUrl()]] メソッドを提供します。 |
|
|
|
|
|
|
|
|
|
アプリケーション構成情報の `urlManager` コンポーネントを構成することによって、既存のアプリケーションコードを修正することなく、任意の URL 形式をアプリケーションに認識させることが出来ます。 |
|
|
|
|
例えば、`post/view` アクションのための URL を生成するためには、次のコードを使うことが出来ます。 |
|
|
|
@ -23,8 +22,8 @@ use yii\helpers\Url;
|
|
|
|
|
$url = Url::to(['post/view', 'id' => 100]); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
このコードによって生成される URL は、`urlManager` の構成に応じて、下記の形式のうちの一つ (またはその他の形式) になります。 |
|
|
|
|
そしてまた、生成された URL が後でリクエストされたときには、解析されて元のルートとクエリパラメータに戻されます。 |
|
|
|
|
このコードによって生成される URL は、`urlManager` の構成に応じて、下記のどれか (またはその他) になります。 |
|
|
|
|
そして、こうして生成された URL が後でリクエストされた場合には、解析されて元のルートとクエリパラメータの値に戻されます。 |
|
|
|
|
|
|
|
|
|
``` |
|
|
|
|
/index.php?r=post/view&id=100 |
|
|
|
@ -37,21 +36,20 @@ $url = Url::to(['post/view', 'id' => 100]);
|
|
|
|
|
|
|
|
|
|
[[yii\web\UrlManager|URL マネージャ]] は二つの URL 形式、すなわち、デフォルトの URL 形式と、綺麗な URL 形式をサポートします。 |
|
|
|
|
|
|
|
|
|
デフォルトの URL 形式は、`r` というクエリパラメータを使用してルートを表し、通常のクエリパラメータを使用してルートに結び付いたクエリパラメータを表します。 |
|
|
|
|
デフォルトの URL 形式は、`r` というクエリパラメータを使用してルートを表し、通常のクエリパラメータを使用してルートに結び付けられたクエリパラメータを表します。 |
|
|
|
|
例えば、`/index.php?r=post/view&id=100` という URL は、`post/view` というルートと、`id` というクエリパラメータが 100 であることを表します。 |
|
|
|
|
デフォルトの URL 形式は、[[yii\web\UrlManager|URL マネージャ]] についての構成を何も必要とせず、ウェブサーバの設定がどのようなものでも動作します。 |
|
|
|
|
|
|
|
|
|
綺麗な URL 形式は、エントリスクリプトの名前に続く追加のパスを使用して、ルートとそれに結び付いたクエリパラメータを表します。 |
|
|
|
|
綺麗な URL 形式は、エントリスクリプトの名前に続く追加のパスを使用して、ルートとそれに結び付けられたクエリパラメータを表します。 |
|
|
|
|
例えば、`/index.php/post/100` という URL の追加のパスは `/post/100` ですが、適切な [[yii\web\UrlManager::rules|URL 規則]] があれば、この URL が `post/view` というルートと `id` というクエリパラメータが 100 であることを表すことが出来ます。 |
|
|
|
|
綺麗な URL 形式を使用するためには、URL をどのように表現すべきかという実際の要求に従って、一連の [[yii\web\UrlManager::rules|URL 規則]] を設計する必要があります。 |
|
|
|
|
|
|
|
|
|
この二つの URL 形式は、[[yii\web\UrlManager|URL マネージャ]] の [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] |
|
|
|
|
プロパティを ON/OFF することによって、他のアプリケーションコードを少しも変えることなく、切り替えることが出来ます。 |
|
|
|
|
この二つの URL 形式は、[[yii\web\UrlManager|URL マネージャ]] の [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] プロパティを ON/OFF することによって、他のアプリケーションコードを少しも変えることなく、切り替えることが出来ます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## ルーティング <span id="routing"></span> |
|
|
|
|
|
|
|
|
|
ルーティングは二つのステップを含みます。最初のステップでは、入ってくるリクエストが解析されて、ルートとそれに結び付いたクエリパラメータに分解されます。 |
|
|
|
|
ルーティングは二つのステップを含みます。最初のステップでは、入ってくるリクエストが解析されて、ルートとそれに結び付けられたクエリパラメータに分解されます。 |
|
|
|
|
そして、第二のステップでは、解析されたルートに対応する [コントローラアクション](structure-controllers.md) がリクエストを処理するために生成されます。 |
|
|
|
|
|
|
|
|
|
デフォルトの URL 形式を使っている場合は、リクエストからルートを解析することは、`r` という名前の `GET` クエリパラメータを取得するだけの簡単なことです。 |
|
|
|
@ -62,21 +60,21 @@ $url = Url::to(['post/view', 'id' => 100]);
|
|
|
|
|
|
|
|
|
|
いったんリクエストからルートが解析されたら、今度はルートによって特定されるコントローラアクションを生成する番です。 |
|
|
|
|
ルートはその中にあるスラッシュによって複数の部分に分けられます。例えば、`site/index` は `site` と `index` に分割されます。 |
|
|
|
|
その各部分がモジュール、コントローラ、アクションを参照する ID となります。 |
|
|
|
|
アプリケーションは、ルートの中の最初の部分から始めて、下記のステップを踏んで、モジュール (もし有れば)、コントローラ、アクションを生成します。 |
|
|
|
|
その各部分は、モジュール、コントローラ、または、アクションを参照する ID です。 |
|
|
|
|
アプリケーションは、ルートの最初の部分の ID から始めて、下記のステップを踏んで、モジュール (もし有れば)、コントローラ、アクションを生成します。 |
|
|
|
|
|
|
|
|
|
1. アプリケーションをカレントモジュールとして設定します。 |
|
|
|
|
2. カレントモジュールの [[yii\base\Module::controllerMap|コントローラマップ]] がカレント ID を含むかどうかを調べます。 |
|
|
|
|
もしそうであれば、マップの中で見つかったコントローラのオブジェクトが構成情報に従って生成されます。 |
|
|
|
|
そして、ルートの残りの部分を処理するために、ステップ 5 に飛びます。 |
|
|
|
|
3. ID がカレントモジュールの [[yii\base\Module::modules|modules]] プロパティのリストに挙げられたモジュールを指すかどうかを調べます。 |
|
|
|
|
もしそうであれば、モジュールのリストで見つかったモジュールが構成情報に従って生成されます。 |
|
|
|
|
そして、ステップ 2 に戻って、新しく生成されたモジュールのコンテキストのもとで、ルートの次の部分を処理します。 |
|
|
|
|
4. ID をコントローラ ID として扱ってコントローラオブジェクトを生成します。 |
|
|
|
|
2. カレントモジュールの [[yii\base\Module::controllerMap|コントローラマップ]] が現在の ID を含むかどうかを調べます。 |
|
|
|
|
含んでいる場合は、マップの中で見つかった構成情報に従ってコントローラのオブジェクトが生成されます。 |
|
|
|
|
そして、ステップ 5 に跳んで、ルートの残りの部分を処理します。 |
|
|
|
|
3. 現在の ID がカレントモジュールの [[yii\base\Module::modules|modules]] プロパティのリストに挙げられたモジュールを指すものかどうかを調べます。 |
|
|
|
|
もしそうであれば、モジュールのリストで見つかった構成情報に従ってモジュールが生成されます。 |
|
|
|
|
そして、新しく生成されたモジュールのコンテキストのもとで、ステップ 2 に戻って、ルートの次の部分を処理します。 |
|
|
|
|
4. 現在の ID をコントローラ ID として扱ってコントローラオブジェクトを生成します。 |
|
|
|
|
そしてルートの残りの部分を持って次のステップに進みます。 |
|
|
|
|
5. コントローラは、[[yii\base\Controller::actions()|アクションマップ]] の中にカレント ID があるかどうかを調べます。 |
|
|
|
|
もし有れば、マップの中で見つかったアクションを構成情報に従って生成します。 |
|
|
|
|
もし無ければ、カレント ID に対応するアクションメソッドによって定義されるインラインアクションを生成しようと試みます。 |
|
|
|
|
5. コントローラは、[[yii\base\Controller::actions()|アクションマップ]] の中に現在の ID があるかどうかを調べます。 |
|
|
|
|
もし有れば、マップの中で見つかった構成情報に従ってアクションを生成します。 |
|
|
|
|
もし無ければ、現在の ID に対応するアクションメソッドで定義されるインラインアクションを生成しようと試みます。 |
|
|
|
|
|
|
|
|
|
上記のステップの中で、何かエラーが発生すると、[[yii\web\NotFoundHttpException]] が投げられて、ルーティングのプロセスが失敗したことが示されます。 |
|
|
|
|
|
|
|
|
@ -109,14 +107,12 @@ $url = Url::to(['post/view', 'id' => 100]);
|
|
|
|
|
|
|
|
|
|
上記の構成によって、入ってくる全てのリクエストを処理するために `site/offline` アクションが使われるようになります。 |
|
|
|
|
|
|
|
|
|
`catchAll` プロパティは配列を取り、最初の要素はルートを指定し、残りの要素 (「名前-値」のペア) は |
|
|
|
|
[アクションのパラメータ](structure-controllers.md#action-parameters) を指定するものでなければなりません。 |
|
|
|
|
`catchAll` プロパティは配列を取り、最初の要素はルートを指定し、残りの要素 (「名前-値」のペア) は [アクションのパラメータ](structure-controllers.md#action-parameters) を指定するものでなければなりません。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## URL を生成する <span id="creating-urls"></span> |
|
|
|
|
|
|
|
|
|
Yii は、与えられたルートとそれに結び付けられるクエリパラメータからさまざまな URL を生成する |
|
|
|
|
[[yii\helpers\Url::to()]] というヘルパメソッドを提供しています。例えば、 |
|
|
|
|
Yii は、与えられたルートとそれに結び付けられたクエリパラメータからさまざまな URL を生成する [[yii\helpers\Url::to()]] というヘルパメソッドを提供しています。例えば、 |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
use yii\helpers\Url; |
|
|
|
@ -171,9 +167,7 @@ echo Url::to(['/post/index']);
|
|
|
|
|
echo Url::to(['@posts']); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
[[yii\helpers\Url::to()]] メソッドは、[[yii\web\UrlManager|URL マネージャ]] の |
|
|
|
|
[[yii\web\UrlManager::createUrl()|createUrl()]] メソッド、および、[[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]] |
|
|
|
|
を呼び出すことによって実装されています。 |
|
|
|
|
[[yii\helpers\Url::to()]] メソッドは、[[yii\web\UrlManager|URL マネージャ]] の [[yii\web\UrlManager::createUrl()|createUrl()]] メソッド、および、[[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]] を呼び出すことによって実装されています。 |
|
|
|
|
次に続くいくつかの項では、[[yii\web\UrlManager|URL マネージャ]] を構成して、生成される URL の形式をカスタマイズする方法を説明します。 |
|
|
|
|
|
|
|
|
|
[[yii\helpers\Url::to()]] メソッドは、特定のルートとの関係を持たない URL の生成もサポートしています。 |
|
|
|
@ -238,11 +232,11 @@ echo Url::previous();
|
|
|
|
|
その他のプロパティはオプションですが、上記で示されている構成が最もよく用いられているものです。 |
|
|
|
|
|
|
|
|
|
* [[yii\web\UrlManager::showScriptName|showScriptName]]: このプロパティは、生成される URL にエントリスクリプトを含めるべきかどうかを決定します。 |
|
|
|
|
例えば、このプロパティを false にすると、`/index.php/post/100` という URL を生成する代りに、`/post/100` という URL を生成することが出来ます。 |
|
|
|
|
例えば、このプロパティを false にすると、`/index.php/post/100` という URL を生成する代りに、`/post/100` という URL を生成することが出来ます。 |
|
|
|
|
* [[yii\web\UrlManager::enableStrictParsing|enableStrictParsing]]: このプロパティは、厳密なリクエスト解析を有効にするかどうかを決定します。 |
|
|
|
|
厳密な解析が有効にされた場合、リクエストされた URL が有効なリクエストとして扱われるためには、それが [[yii\web\UrlManager::rules|rules]] の少なくとも一つに合致しなければなりません。 |
|
|
|
|
そうでなければ、[[yii\web\NotFoundHttpException]] が投げられます。 |
|
|
|
|
厳密な解析が無効にされると、リクエストされた URL が [[yii\web\UrlManager::rules|rules]] のどれにも合致しない場合は、URL のパス情報の部分がリクエストされたルートとして扱われます。 |
|
|
|
|
厳密な解析が無効にされた場合は、リクエストされた URL が [[yii\web\UrlManager::rules|rules]] のどれにも合致しない場合は、URL のパス情報の部分がリクエストされたルートとして扱われます。 |
|
|
|
|
* [[yii\web\UrlManager::rules|rules]]: このプロパティが URL を解析および生成するための一連の規則を含みます。 |
|
|
|
|
このプロパティが、アプリケーションの固有の要求を満たす形式を持つ URL を生成するために、あなたが主として使うプロパティです。 |
|
|
|
|
|
|
|
|
@ -257,10 +251,9 @@ URL 規則は [[yii\web\UrlRule]] またはその子クラスのインスタン
|
|
|
|
|
URL 規則は、パターンがリクエストされた URL と合致する場合に、リクエストの解析に使用することが出来ます。 |
|
|
|
|
また、URL 規則は、ルートとクエリパラメータ名が与えられたものと合致する場合に、URL の生成に使用することが出来ます。 |
|
|
|
|
|
|
|
|
|
綺麗な URL 形式が有効にされている場合、[[yii\web\UrlManager|URL マネージャ]] は、その [[yii\web\UrlManager::rules|rules]] |
|
|
|
|
プロパティに宣言されている URL 規則を使って、入ってくるリクエストの解析と URL の生成を行います。 |
|
|
|
|
綺麗な URL 形式が有効にされている場合、[[yii\web\UrlManager|URL マネージャ]] は、その [[yii\web\UrlManager::rules|rules]] プロパティに宣言されている URL 規則を使って、入ってくるリクエストの解析と URL の生成を行います。 |
|
|
|
|
具体的に言えば、入ってくるリクエストを解析するためには、[[yii\web\UrlManager|URL マネージャ]] は宣言されている順に規則を調べて、リクエストされた URL に合致する *最初の* 規則を探します。 |
|
|
|
|
そして、その合致する規則を使って URL を解析して、ルートとそれと結合されたパラメータを得ます。 |
|
|
|
|
そして、その合致する規則を使って URL を解析して、ルートとそれに結び付けられたパラメータを得ます。 |
|
|
|
|
同じように、URL を生成するためには、[[yii\web\UrlManager|URL マネージャ]] は、与えられたルートとパラメータに合致する最初の規則を探して、それを使って URL を生成します。 |
|
|
|
|
|
|
|
|
|
[[yii\web\UrlManager::rules]] は、パターンをキーとし、それに対応するルートを値とする配列として構成することが出来ます。 |
|
|
|
@ -280,7 +273,7 @@ URL 規則は、パターンがリクエストされた URL と合致する場
|
|
|
|
|
例えば、`/index.php/post/100?source=ad` のパス情報は `post/100` であり (先頭と末尾のスラッシュは無視します)、これは `post/(\d+)` というパターンに合致します。 |
|
|
|
|
|
|
|
|
|
URL 規則は、「パターン - ルート」のペアとして宣言する以外に、構成情報配列として宣言することも出来ます。 |
|
|
|
|
すべての構成情報配列が、それぞれ、一つの URL 規則のオブジェクトを構成するために使われます。 |
|
|
|
|
構成情報の一つの配列が、それぞれ、一つの URL 規則のオブジェクトを構成するために使われます。 |
|
|
|
|
この形式は、URL 規則の他のプロパティを構成したい場合に、よく必要になります。 |
|
|
|
|
例えば、 |
|
|
|
|
|
|
|
|
@ -296,7 +289,7 @@ URL 規則は、「パターン - ルート」のペアとして宣言する以
|
|
|
|
|
] |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
規則の構成情報で `class` を指定しない場合は、デフォルトとして、[[yii\web\UrlRule]] が使われます。 |
|
|
|
|
URL 規則の構成情報で `class` を指定しない場合は、デフォルトとして、[[yii\web\UrlRule]] が使われます。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 名前付きパラメータ <span id="named-parameters"></span> |
|
|
|
@ -305,10 +298,10 @@ URL 規則は、パターンの中で `<ParamName:RgExp>` の形式で指定さ
|
|
|
|
|
ここで、`ParamName` はパラメータ名を指定し、`RegExp` はパラメータの値との照合に使われるオプションの正規表現を指定するものです。 |
|
|
|
|
`RegExp` が指定されていない場合は、パラメータの値がスラッシュを含まない文字列であるべきことを意味します。 |
|
|
|
|
|
|
|
|
|
> Note|注意: 正規表現はパラメータに対してのみ指定できます。パターンの残りの部分は平文テキストであると見なされます。 |
|
|
|
|
> Note|注意: 正規表現はパラメータに対してのみ指定できます。パターンの残りの部分はプレーンテキストとして解釈されます。 |
|
|
|
|
|
|
|
|
|
規則が URL の解析に使われるときには、結び付けられたパラメータに、URL の対応する部分に合致する値が入れられます。 |
|
|
|
|
そして、これらのパラメータは、後に `request` アプリケーションコンポーネントによって、`$_GET` に入れられて利用できるようになります。 |
|
|
|
|
規則が URL の解析に使われるときには、URL の対応する部分に合致した値が、結び付けられたパラメータに入れられます。 |
|
|
|
|
そして、そのパラメータは、後に `request` アプリケーションコンポーネントによって、`$_GET` に入れられて利用できるようになります。 |
|
|
|
|
規則が URL の生成に使われるときは、提供されたパラメータの値を受けて、パラメータが宣言されている所にその値が挿入されます。 |
|
|
|
|
|
|
|
|
|
名前付きパラメータの動作を説明するためにいくつかの例を挙げましょう。次の三つの URL 規則を宣言したと仮定してください。 |
|
|
|
@ -361,11 +354,11 @@ URL 規則のルートにはパラメータ名を埋め込むことが出来ま
|
|
|
|
|
> Info|情報: ルートをパラメータ化することによって、URL 規則の数を大幅に減らすことが可能になり、[[yii\web\UrlManager|URL マネージャ]] のパフォーマンスを目に見えて改善することが出来ます。 |
|
|
|
|
|
|
|
|
|
デフォルトでは、規則の中で宣言されたパラメータは必須となります。 |
|
|
|
|
リクエストされた URL が特定のパラメータを含まない場合や、URL が特定のパラメータなしで生成される場合には、規則は適用されません。 |
|
|
|
|
リクエストされた URL が特定のパラメータを含まない場合や、特定のパラメータなしで URL を生成する場合には、規則は適用されません。 |
|
|
|
|
パラメータのどれかをオプション扱いにしたい場合は、規則の [[yii\web\UrlRule::defaults|defaults]] プロパティを構成することが出来ます。 |
|
|
|
|
このプロパティのリストに挙げられたパラメータはオプション扱いとなり、規定されなかった場合は指定された値を取るようになります。 |
|
|
|
|
このプロパティのリストに挙げられたパラメータはオプション扱いとなり、提供されなかった場合は指定された値を取るようになります。 |
|
|
|
|
|
|
|
|
|
次の規則の宣言においては、`page` と `tag` のパラメータは両方ともオプション扱いで、規定されなかった場合は、それぞれ、1 と空文字列を取ります。 |
|
|
|
|
次の規則の宣言においては、`page` と `tag` のパラメータは両方ともオプション扱いで、提供されなかった場合は、それぞれ、1 と空文字列を取ります。 |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
[ |
|
|
|
@ -438,8 +431,7 @@ URL 規則のパターンには、ウェブサーバ名を含むことが出来
|
|
|
|
|
] |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
上記の構成によって、[[yii\web\UrlManager|URL マネージャ]] は、接尾辞として `.html` の付いた URL |
|
|
|
|
を認識し、また、生成するようになります。 |
|
|
|
|
上記の構成によって、[[yii\web\UrlManager|URL マネージャ]] は、接尾辞として `.html` の付いた URL を認識し、また、生成するようになります。 |
|
|
|
|
|
|
|
|
|
> Tip|ヒント: URL が全てスラッシュで終るようにするためには、URL 接尾辞として `/` を設定することが出来ます。 |
|
|
|
|
|
|
|
|
|