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"」です。お楽しみに!