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 フル -> 後勝ち