Laravelのチュートリアルにおいてルーティングは/route/web.phpに記述する様に指示されます。実際このweb.phpとRouteファサード、ミドルウェアを用いるだけで大抵のやりたいルーティングは実現できます。しかしながらあくまで大抵であり、より深いことを行おうとした場合、もっと元の部分からルーティングを扱う必要があります。またルーティングパターンがあまりに多い時も元をさわってルーティングを記述するファイルを増やすことが可読性に貢献します。
/app/Providers/RouteServiceProviderは/route/web.phpを呼び出し、ルーティングのマップを定義するコードです。ソースコードには次の様にあります。
/** * Define the routes for the application. * @return void */ public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); } /** * Define the "web" routes for the application. * These routes all receive session state, CSRF protection, etc. * @return void */ protected function mapWebRoutes() { Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); }
コメントとコードの通り各ルーティングのマップ呼び出し、webのルーティングを定義、というメソッドらです。例えばルーティングファイルを増やしたいならば次の様に行えます。
/** * Define the routes for the application. * @return void */ public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); $this->mapAppRoutes(); } /** * Define the "web" routes for the application. * These routes all receive session state, CSRF protection, etc. * @return void */ protected function mapWebRoutes() { Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); } /** * アプリ用ルーティングの定義 * @return void */ protected function mapAppRoutes() { Route::prefix('app') ->middleware('web') ->namespace($this->namespace) ->group(base_path('routes/app.php')); }
もうほとんどコピペです。他にもモデルを定義する事によりコントローラ上の引数で楽をできます。
// RouteServiceProvider内部 /** * Define your route model bindings, pattern filters, etc. * @return void */ public function boot() { parent::boot(); Route::model('member_rank', MemberRankMaster::class);// 追記部 }
// route/web.php内部 Route::resource('member_rank', 'Admin\MemberRankController');
上のコードの様にモデルクラスとルーティング名の対応の定義とそのルーティング名によるコントローラの呼び出しを記述することによって
/** * member_rank/{id}/editで呼び出されるメソッド * Show the form for editing the specified resource. * @param MemberRankMaster $rank * @return \Illuminate\Http\Response */ public function edit(MemberRankMaster $rank) { return view('admin.pages.member_rank.edit') ->with(compact('rank')); }
このように引数でいきなりMemberRankMaster::findOrFail($id)で得られる様なEloquentオブジェクトが使えます。わかりやすい上にシンプルな記述で済みますね。