FuelPHPサイド
FuelBeans 6 : ルーティングの基礎
FuelBeans 6 : ルーティングの基礎
フレームワークを利用する利点の一つは、ルーティングの仕組みを利用できることが挙げられます。
ルーティングとはPHPのフレームワークに関して定義づければ、ドメインに続いて指定されたURLの内容から、そのフレームワーク上で動作する実際のクラスなり、関数なりを指定するための仕組みのことです。
FuelPHPでは標準的なルーティングは環境ファイルとして、定義付けます。何はさておき、実際の動作をまず経験しましょう。
今行った内容のルーティングを見てみましょう。IDEでfuelphp/fuel/app/config/routes.phpをダブルクリックで開いてください。エディターでファイルの中身が表示されます。
内容はこのようになっています。
<?php
return array(
'_root_' => 'welcome/index', // The default route
'_404_' => 'welcome/404', // The main 404 route
'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),
);
FuelPHPの環境ファイルは全部PHPの実行コードになっています。配列で環境を定義し、その内容をリターンしています。
ルーティング定義の場合、配列のキーがURLのパターンです。キーに対する値が、実行されるクラスと関数、そして引数を表します。
キーの_root_と_404_は特別の意味を持っています。まず、_root_ですが、これはブラウザからアクセスするURLで、FuelPHPのpublicフォルダーの位置だけを指定された場合、いわゆるトップページを表示するときに、利用されるパターンです。
_404_のパターンは、その数字が示す如く、ルーティングのパターンに一致するものが見つからない場合に、ルートされます。いわゆる、「ページが見つかりません」ページを表示するための、ルートです。
このroutes.phpに定義されていなくても自動的に行われる、暗黙のルーティングがあります。このチュートリアルの場合、localhost/publicだけを指定した場合、_root_で定義されている先が実行されますが、localhost/public/のあとはクラス名、アクション名、引数1、引数2、引数3…と指定できます。
クラス名はfuel/app/classes/controllerのファイル名と同じです。厳密に言えばクラス名なのです。controllerの下にフォルダーがあり、その下にクラスがある場合、もうちょっとややこしくなります。オートロードの仕組みと関係があるのです。まあ、ここでは簡単にファイル名と同じと覚えておきましょう。
アクション名はそのクラスに含まれている関数の名前ですが、先頭にaction_が付きます。
引数はその関数に渡される引数の並びです。無くてもかまいませんし、いくつあってもかまいません。
例えば、localhost/kumi/kodo/10/200/33と渡された場合、ルーティングに定義していなくても、kumiクラス、つまりfuel/app/classes/controller/kumi.phpの中に、Controller_Kumiクラスが定義されており、そのクラスにAction_kodo関数があれば、これが実行され、引数として、10、200、33が渡されます。
この場合、kumiクラスがなかったり、kodoアクションの関数がなければ、_404_で定義されたクラス/アクションが実行されるわけです。
もう一つ、大事な暗黙のルールがあり、クラスだけが指定され、アクションが指定されない場合、そのクラスにaction_index関数があれば実行されます。なければ、_404_が実行されます。
この暗黙のルーティングは、どのフレームワークでも似たようなものです。他のフレームワークをご存知のかたなら、慣れたものだと思います。
今まではキー値で指定するパターンについてでした。今度は=>の右側、値で指定する項目の説明です。
右側の値として指定するのは左側から順番にクラス、アクション、引数1、引数2、引数3…です。そう、暗黙のルーティングと同じですね。
もちろん、こちらで指定する値が存在していなくても_404_パターンに行ってしまいます。思ってもいない_404_の時は、左側のキー値だけでなく、右側に指定するルート先も確認してください。
この暗黙のルーティングがあるおかげで、前回作成したhelloworld.phpはこのルーティングを定義しなくても実行できたわけです。
さて、先ほどの実験に戻りましょう。helloだけですと、Hello、Worldが表示され、hello/名前ですと、その名前が表示されました。routes.phpにはこう指定されています。
'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),
左側のパターンには正規表現が利用できます。まずhelloで始まり、その後に/:nameが存在するか、しないかという意味になります。:nameはFuelPHPのルーティング独自の拡張です。ここでは:nameの部分があらゆる文字列と一致すると考えてください。?はその前のパターンが0回か1回、つまり無いか、一回だけある場合に一致します。つまりlocalhost/public/helloかlocalhost/public/hello/名前に一致するパターンです。(かなり、上級のパターンですよ。)
右側も高度です。配列の最初が、クラスとアクションです。後ろ側のnameはキー値で指定した:nameとは関係ありません。配列の2つめに'name'というパターンがある場合、その値をコードの中でルーティングのエイリアスとして利用できます。つまり、プログラム中、ルーティングを指定するのはhtmlのリンクのアンカーを指定する場合です。FuelPHPではHtml::anchor()関数を使いアンカーを生成します。この時、URLの代わりに'hello'を指定すると、自動的にwelcom/helloへのリンクが生成される仕組みです。
ちょっと、いきなり難しすぎて、ちんぷんかんぷんですね。では、書きなおしてみましょう。先ほどの1行を以下のように書きなおしてください。
'hello' => 'welcome/hello',
'hello/:name' => welcome/hello',
単純に2行に分け、単純にしました。これならわかりやすいでしょう?IDEから実行して/helloと/hello/名前で確かめてください。先ほどと同じように動作します。
helloだけの場合と、helloに続いて名前が指定された場合はどちらもwelcomeクラスのhelloアクションか、それ以降のコード中で判断して、表示を切り分けています。(実際、このwelcomeのサンプルは、こんなことも出来るよと、複雑に作られており、初めてFuelPHPを使う方には、面倒でわかりづらいように思えます。もっと単純に使えますので、ご安心ください。)
| FuelBeans 4 : ヘロー、わーるど< 前 | 次 >FuelBeans 8 : ルーティング、more about |
|---|
| < 前 | 次 > |
|---|