Laravel初心者に知って欲しいルーティングの見やすい書き方とあれこれ

# ルーティング綺麗に書いた方が見やすくない？

Laravelでいう`routes/web.php`のこと
初学者のコード見てるともう少しすっきり書けるのになー
そもそも使い方があんまり分からないのかな？と思い記事にする事にしました

## そもそもどういう仕組み

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_293438_2c0af10e-1ee8-79e3-1b8c-53069c92e6ae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293438/20a668eb-2566-9a74-3385-55a692919df3.png)

`HTTP動詞`

postだったりgetだったりresourceとかその時のHTTP動詞を指定

`URLのパス`

定義した文字にアクセスした時に適用されるルート

`コントローラー名`

app/Http/Controllers/の中で定義したいコントローラーを指定

`メソッド名`

上記で設定したコントローラー内のメソッドを指定


## 早速見やすい書き方講座

一般的な例としてユーザーが一般ユーザーと管理者で分かれており、それぞれにTOPページとCRUDページ（投稿・一覧・更新・削除・あと詳細）があるという構成です

`良くある例`

```php:web.php
// 一般ユーザー
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');
});
```

何だか全体的に記述が多いですよね...
これをもう少し見やすくしていきましょう。

`今回提唱したい例`

```php:web.php
// 一般ユーザー
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までの書き方で、
それ以降は`->`メソッドチェーンで定義するのが主流です！


`古い例`

```php:web.php
Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function () {
    //
});
```

`新しい例`

```php:web.php
Route::prefix('admin')->middreware('auth:admin')->group(function () {
    //
});
```

### 名前空間

ルートグループの`namespace`を使用する事でそのグループ内に定義したルート全てに名前空間が適用されます。
そのためわざわざルート毎に`Admin/`と付ける必要がなくなります。

`古い例`

```php:web.php
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});
```

`新しい例`

```php:web.php
Route::middleware('auth:admin')->namespace('Admin')->group(function() {
    Route::get('admin/home', 'HomeController@index')->name('admin.home.index');
});
```

### ルートプレフィックス

ルートグループの`prefix`を使用する事でそのグループ内に定義したルート全てにURIを指定することができます。
そのためわざわざルート毎にURIのパスを`admin/`と付ける必要がなくなります。

`古い例`

```php:web.php
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});
```

`新しい例`

```php:web.php
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.`と付ける必要がなくなります。

`古い例`

```php:web.php
Route::group(['middleware' => 'auth:admin'], function() {
    Route::get('admin/home', 'Admin/HomeController@index')->name('admin.home.index');
});
```

`新しい例`

```php:web.php
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（削除処理）

そのためこの様に行を短縮出来たんですね！

`古い例`

```php:web.php
    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');
```

`新しい例`

```php:web.php
Route::resource('post', 'PostController');
```

また`resource`はname()も勝手に付与してくれるため、その煩わしさもなくなります！
とっても便利ですね！

## 最後に

今回は短く書くことで興味を引く作戦でしたが、短ければ良いコードというわけではない。
読みやすく、改修が容易に済むコードを心掛けましょう()