Laravel4のroutes.phpでルーティング効かないと思ったら順番の問題
Laravelのroutingも便利なもので、
Route::resource('users')のようにすると
以下のようなルーティングが自動生成されます。
Laravel - The PHP framework for web artisans.
さらに、そこから余計なものを作らない時には
以下のようにonlyで絞ることが出来ます。
Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'access_admin'], function() { Route::resource('users', 'UsersController', [ 'only' => ['index', 'show'], ]); }
イメージとしては、Admin画面でユーザー一覧(index)と
ユーザーページ(show)だけ存在しているという感じです。
問題
で、まぁ何かの拍子にhogeしてるUserだけ見れるページ作ろうと思い
このようにルーティングを追加しました。
Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'access_admin'], function() { Route::resource('users', 'UsersController', [ 'only' => ['index', 'show'], ]); Route::get('users/hoge_user', [ 'as' => 'admin.users.hoge_user', 'uses' => 'UsersController@hoge_user' ]); }
/admin/users/hoge_userにアクセス!!
しかし、動かない・・・・!?
うそ、動くんだけども、どうしてもshowメソッドが呼び出されてしまう。
解決
タイトルの通り、順番がいけなかったようで、
routes.phpでは上からroutingに一致するものを探すようになっており
その結果、/admin/users/(スラッシュ)以下に文字が含まれているので
showメソッドが呼び出されてしまっていた。
Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'before' => 'access_admin'], function() { Route::get('users/hoge_user', [ 'as' => 'admin.users.hoge_user', 'uses' => 'UsersController@hoge_user' ]); Route::resource('users', 'UsersController', [ 'only' => ['index', 'show'], ]); }
結果、このように入れ替えてあげると意図通りに動作するようになった。
なんかCakePHPでもRuby on Railsでも同じような目にあった気がする・・・w
でも、すぐに気づけたので成長してるってことかな。
さて、どんどん新機能付けて行こう₍₍⁽⁽(ી(*゚▽゚*)ʃ)₎₎⁾⁾