Ich habe hunger

あふりかエンジニア、アフリカ向けのB2BのSaaSを開発する

Laravel4のroutes.phpでルーティング効かないと思ったら順番の問題

Laravelのroutingも便利なもので、
Route::resource('users')のようにすると
以下のようなルーティングが自動生成されます。

f:id:sugi511:20141203172113p:plain
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

でも、すぐに気づけたので成長してるってことかな。

さて、どんどん新機能付けて行こう₍₍⁽⁽(ી(*゚▽゚*)ʃ)₎₎⁾⁾