FuelPHP の URL とコントローラの関係
FuelPHP Advent Calendar 2011 の 14日目です。そろそろ燃料切れっぽくなってきていますので、新しい参加者がぞくぞくと登場することを期待したいところです。
ところで、現地時間の昨日 12/13、FuelPHP 1.1 が正式リリースされました。
今後の開発は 1.2 へ移るそうです。
FuelPHP は最近はユーザが増え、フィードバックも増え、安定性も増してきているようですが、いかんせん、まだ新しいフレームワークであり、ユーザベースも他のメジャーなフレームワークよりは少なく、細かいバグや未実装な部分は、ドキュメントも含め残っています。ということで、引き続きコードレビューやバグ報告、バグ修正、ドキュメントの翻訳など進めていこうと思います。
さて、アドベントカレンダーですが、昨日の水野さんの「PHP5.3 の名前空間入門」に続き、今日は、FuelPHP の基本的なこと、URL とコントローラの関係、コントローラの命名規則、ルーティングの基礎について解説します。
FuelPHP の URL の構造
FuelPHP の URL の基本的な構造は、以下のようになっています。
http://example.jp/index.php/コントローラ/メソッド/引数1/引数2/...
mod_rewrite などで index.php を消した場合は、以下のようになります。
http://example.jp/コントローラ/メソッド/引数1/引数2/...
そして、URL とコントローラは基本的に対応します。
例えば、以下の URL の場合、
http://example.jp/shop/search/123
コントローラは、
- app/classes/controller/shop.php
に配置し、以下のようになります。この URL にアクセスされると action_search() メソッドが実行され、引数の $id には文字列の 123 が代入されることになります。
class Controller_Shop extends Controller { ... function action_search($id) { ... } }
コントローラの基本的な命名規則をまとめると、以下のようになります。
- Controller クラスを継承(他にも Controller_Template クラスと Controller_Rest クラスというのもありますが)
- クラス名には先頭に「Controller_」を付ける
- 「Controller_」の後の単語の先頭は大文字
- ブラウザからアクセスできるメソッドには先頭に「action_」を付ける
- ファイル名やフォルダ名はすべて小文字(FuelPHP での共通の規約)
- クラス名の中の「_」はフォルダ区切りを意味する
ブラウザからアクセスされたくないメソッドは「action_」を付けなければ OK ということになり、また、クラス名に「Controller_」が付くため、List のような PHP の予約語も使用できます。
メソッド名が省略された
http://example.jp/shop/
のような URL にアクセスされた場合には、action_index() メソッドが実行されます。
コントローラのクラス名とファイル名の対応
コントローラはサブフォルダに配置することもできます。
http://example.jp/サブフォルダ名/コントローラ/メソッド/引数1/引数2/...
フォルダ区切り文字はクラス名では「_」になりますので、例えば、以下のようになります。
app/classes/controller/time/message.php
<?php class Controller_Time_Message extends Controller { function action_index() { } }
上記の場合、
http://example.jp/time/message
にアクセスすると、action_index() メソッドが実行されます。
また、
app/classes/controller/time.php
<?php class Controller_Time extends Controller { function action_message() { } }
上記の場合でも、
http://example.jp/time/message
にアクセスでき、こちらは action_message() メソッドが実行されます。
では、両方のコントローラがあったら、どうなるでしょうか?
これは、Controller_Time クラスが優先されました。
URL のクラス名の場所に「_」を使いたい
このような要求があるかどうかわかりませんが、クラス名の「_」はフォルダ区切りになるという命名規則により
http://example.jp/time_message
のような URL はそのままでは使えません。
このような場合は、ルーティングの機能を使います。ルーティングの設定ファイルは
- app/config/route.php
にあります。このファイルにルーティングの定義を追加します。
例えば、上の URL にアクセスされた場合は、Controller_Time クラスの action_index() メソッドを実行するように設定するには、以下の行を追加します。
<?php return array( '_root_' => 'welcome/index', // The default route '_404_' => 'welcome/404', // The main 404 route 'time_message' => 'time/index', );
最初から存在する _root_ は、コントローラ名の省略された URL にアクセスされた場合、_404_ はページが見つからなかった場合に表示する URL を定義します。
モジュールを使う場合
FuelPHP には、MVC のコードを機能別に 1つのフォルダにまとめて配置することができる「モジュール」と呼ばれる機能があります。
モジュールの詳細は、FuelPHP Advent Calendar 12日目の @mataga さんの
を参照してください。
モジュールを使う場合は、URI の第1セグメントがモジュール名になります。
http://example.jp/モジュール名/コントローラ/メソッド/引数1/引数2/...
なお、モジュールを有効にした場合は、モジュール名と同じ名前のコントローラが app/classes/controller/ にあったとしても、モジュールが優先されます。
明日は、@eifuku さんの「cent osでのphp5.3環境のセットアップ with "yum"」です。お楽しみに!