ルーティング綺麗に書いた方が見やすくない?
Laravelでいうroutes/web.php
のこと
初学者のコード見てるともう少しすっきり書けるのになー
そもそも使い方があんまり分からないのかな?と思い記事にする事にしました
そもそもどういう仕組み
HTTP動詞
postだったりgetだったりresourceとかその時のHTTP動詞を指定
URLのパス
定義した文字にアクセスした時に適用されるルート
コントローラー名
app/Http/Controllers/の中で定義したいコントローラーを指定
メソッド名
上記で設定したコントローラー内のメソッドを指定
早速見やすい書き方講座
一般的な例としてユーザーが一般ユーザーと管理者で分かれており、それぞれにTOPページとCRUDページ(投稿・一覧・更新・削除・あと詳細)があるという構成です
良くある例
// 一般ユーザー
Route::group(['middleware' => 'auth:user'], function() {
Route::get('home', 'User/HomeController@index')->name('user.home.index');
Route::get('post', 'User/PostController@index')->name('user.post.index');
Route::get('post/show/{id}', 'User/PostController@show')->name('user.post.show');
Route::get('post/create', 'User/PostController@create')->name('user.post.create');
Route::post('post/store', 'User/PostController@store')->name('user.post.store');
Route::get('post/edit/{id}', 'User/PostController@edit')->name('user.post.edit');
Route::post('post/update/{id}', 'User/PostController@update')->name('user.post.update');
Route::post('post/destroy/{id}', 'User/PostController@destroy')->name('user.post.destroy');
});
// 管理者ユーザー
Route::group(['middleware' => 'auth:admin'], function() {
Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
Route::get('admin/post', 'Admin/PostController@index')->name('admin.post.index');
Route::get('admin/post/show/{id}', 'Admin/PostController@show')->name('admin.post.show');
Route::get('admin/post/create', 'Admin/PostController@create')->name('admin.post.create');
Route::post('admin/post/store', 'Admin/PostController@store')->name('admin.post.store');
Route::get('admin/post/edit/{id}', 'Admin/PostController@edit')->name('admin.post.edit');
Route::post('admin/post/update/{id}', 'Admin/PostController@update')->name('admin.post.update');
Route::post('admin/post/destroy/{id}', 'Admin/PostController@destroy')->name('admin.post.destroy');
});
何だか全体的に記述が多いですよね...
これをもう少し見やすくしていきましょう。
今回提唱したい例
// 一般ユーザー
Route::middleware('auth:user')->namespace('User')->name('user.')->group(function() {
Route::resource('home', 'HomeController', ['only' => 'index']);
Route::resource('post', 'PostController');
});
// 管理者ユーザー
Route::middleware('auth:admin')->namespace('Admin')->prefix('admin')->name('admin.')->group(function() {
Route::resource('home', 'HomeController', ['only' => 'index']);
Route::resource('post', 'PostController');
});
かなりすっきりしました!
仕組みを解説していきます。
ルートグループのメソッドチェーン
良く見られる配列で指定するルートグループの書き方は実はLaravel5.3までの書き方で、
それ以降は->
メソッドチェーンで定義するのが主流です!
古い例
Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function () {
//
});
新しい例
Route::prefix('admin')->middreware('auth:admin')->group(function () {
//
});
名前空間
ルートグループのnamespace
を使用する事でそのグループ内に定義したルート全てに名前空間が適用されます。
そのためわざわざルート毎にAdmin/
と付ける必要がなくなります。
古い例
Route::group(['middleware' => 'auth:admin'], function() {
Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});
新しい例
Route::middleware('auth:admin')->namespace('Admin')->group(function() {
Route::get('admin/home', 'HomeController@index')->name('admin.home.index');
});
ルートプレフィックス
ルートグループのprefix
を使用する事でそのグループ内に定義したルート全てにURIを指定することができます。
そのためわざわざルート毎にURIのパスをadmin/
と付ける必要がなくなります。
古い例
Route::group(['middleware' => 'auth:admin'], function() {
Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});
新しい例
Route::middleware('auth:admin')->namespace('Admin')->prefix('admin')->group(function() {
Route::get('home', 'HomeController@index')->name('admin.home.index');
});
ルート名
ルート名使ってますか??
意外と便利なので使うようにしましょう!
説明はかずへいさんの記事に任せます!
[Laravel使うならrouteには名前をつけたほうが良い]
(https://qiita.com/kazuhei/items/935257b0d72fa314d461)
ルートグループのname
を使用する事でそのグループ内に定義したルート全てにルート名を指定することができます。
そのためわざわざルート毎にnameをadmin.
と付ける必要がなくなります。
古い例
Route::group(['middleware' => 'auth:admin'], function() {
Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});
新しい例
Route::middleware('auth:admin')->namespace('Admin')->prefix('admin')->name('admin.')->group(function() {
Route::get('home', 'HomeController@index')->name('home.index');
});
resource
多分初学者の方は一番ここに興味持たれたのではないでしょうか。
resourceはリソースコントローラーと呼ばれ、一般的なCRUD(投稿・一覧・更新・削除・あと詳細)操作を予めLaravel側が用意してくれるというものです。
web.phpではHTTP動詞をRoute::resource
とする事で以下のメソッドを定義した扱いとなります。
- index(一覧)
- show(詳細)
- create(作成画面)
- store(作成処理)
- edit(編集画面)
- update(編集処理)
- destroy(削除処理)
そのためこの様に行を短縮出来たんですね!
古い例
Route::get('admin/post', 'Admin/PostController@index')->name('admin.post.index');
Route::get('admin/post/show/{id}', 'Admin/PostController@show')->name('admin.post.show');
Route::get('admin/post/create', 'Admin/PostController@create')->name('admin.post.create');
Route::post('admin/post/store', 'Admin/PostController@store')->name('admin.post.store');
Route::get('admin/post/edit/{id}', 'Admin/PostController@edit')->name('admin.post.edit');
Route::post('admin/post/update/{id}', 'Admin/PostController@update')->name('admin.post.update');
Route::post('admin/post/destroy/{id}', 'Admin/PostController@destroy')->name('admin.post.destroy');
新しい例
Route::resource('post', 'PostController');
またresource
はname()も勝手に付与してくれるため、その煩わしさもなくなります!
とっても便利ですね!
最後に
今回は短く書くことで興味を引く作戦でしたが、短ければ良いコードというわけではない。
読みやすく、改修が容易に済むコードを心掛けましょう()