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