ルーティング実験

Laravel 4 のルーティングは、少々複雑なので少し実験をしてみました。
使用した Laravel のバージョンは、4.1.11 です。

まず、基本的な指定方法の調査です。
次のような SampleController を用意します。

// SampleController.php
class SampleController extends BaseController {
	public function anyHoge() {
		return 'Called SampleController::anyHoge';
	}
}

上記コントローラをサイトのトップノードに関連付ける場合は、次のようにルートを定義します。

// routes.php
Route::controller('/', 'SampleController');

上記の書き方は Laravel のドキュメントでも使用されています。

Laravel のドキュメントには書かれていませんが、スラッシュを省略しても正しく認識されるようです。

// routes.php
Route::controller('', 'SampleController');

一方、Laravel のドキュメントではパスを指定して定義する場合は

// routes.php
Route::controller('foo', 'SampleController');
のように、先頭にスラッシュを付けていませんが
// routes.php
Route::controller('/foo', 'SampleController');
のように、先頭にスラッシュを付けても同じように動作します。

まず、同じルートを定義した場合の実験です。 次のような SampleController を用意します。

class SampleController extends BaseController {
	public function method1() {
		return 'Called mthod1';
	}
	public function method2() {
		return 'Called mthod2';
	}
}

続いて routes.php に次のようにルートを定義します。

Route::any('sample/hoge', 'SampleController@method1');
Route::any('sample/hoge', 'SampleController@method2');
この設定では、2 番目の設定が有効になり、http://[サーバールート]/sample/hoge にアクセスした場合は method2 が呼ばれます。 どうやら後勝ちのようです。 実際に上下を入替えて
Route::any('sample/hoge', 'SampleController@method2');
Route::any('sample/hoge', 'SampleController@method1');
とした場合は method1 が呼ばれます。 続いて REST フルコントローラーへのルーティングとの比較です。 SampleController を次のように定義します。
class SampleController extends BaseController {
	public function jump() {
		return 'Called jump';
	}
	public function anyHoge() {
		return 'Called anyHoge';
	}
}
routes.php では次のように定義します。
Route::any('sample/hoge', 'SampleController@jump');
Route::controller('sample', 'SampleController');
上記設定で http://[サーバールート]/sample/hoge にアクセスすると jump メソッドが呼ばれます。 こちらでも定義を入替えて次のようにしてアクセスしてみます。
Route::controller('sample', 'SampleController');
Route::any('sample/hoge', 'SampleController@jump');
すると、anyHoge が呼ばれます。 HTTP 動詞へのルートと REST フルコントローラーへのルートを定義した場合では、 先勝ちになるようです。 続いて REST フル同士の比較です。 SampleController を次のように定義。
class SampleController extends BaseController {
	public function anyHoge() {
		return 'Called SampleController::anyHoge';
	}
}
あらたに AppleController というファイルを追加して次のように定義。
class AppleController extends BaseController {
	public function anyHoge() {
		return 'Called AppleController::anyHoge';
	}
}
以上のように同じメソッドを持たせます。 routes.php は次のように定義します。
Route::controller('tekito', 'SampleController');
Route::controller('tekito', 'AppleController');
http://[サーバールート]/tekito/hoge にアクセスすると、 AppleController の anyHoge が呼ばれます。 これまでと同様に入替えます。
Route::controller('tekito', 'AppleController');
Route::controller('tekito', 'SampleController');
すると、SampleController の anyHoge が呼ばれます。 後勝ちのようです。 一旦ここまでをまとめると、 HTTP 動詞 : HTTP 動詞 -> 後勝ち HTTP 動詞 : REST フル -> 先勝ち REST フル : REST フル -> 後勝ち