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オブジェクトが使えます。わかりやすい上にシンプルな記述で済みますね。