LaravelでRoute::resourceを使用する時

##概要
Route::resourceを使用した時に必要のないrouteを無効にする方法。

##環境
Laravel: 7.21.0

##resourceコントローラの生成

下記のコマンドでルートとコントローラを自動的に割り付けてくれます。

```
php artisan make:controller PostController --resource
```

artisanコマンドで生成されたコントローラは以下のような内容です。

```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}
```

##ルーティングの指定
Route::resourceを使うと必要なルートを記述を一度だけで指定できます。

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

ルーティングは下記のような内容になります。

```
+--------+-----------+------------------+--------------+---------------------------------------------+------------+
| Domain | Method    | URI              | Name         | Action                                      | Middleware |
+--------+-----------+------------------+--------------+---------------------------------------------+------------+
|        | GET|HEAD  | post             | post.index   | App\Http\Controllers\PostController@index   | web        |
|        | POST      | post             | post.store   | App\Http\Controllers\PostController@store   | web        |
|        | GET|HEAD  | post/create      | post.create  | App\Http\Controllers\PostController@create  | web        |
|        | GET|HEAD  | post/{post}      | post.show    | App\Http\Controllers\PostController@show    | web        |
|        | PUT|PATCH | post/{post}      | post.update  | App\Http\Controllers\PostController@update  | web        |
|        | DELETE    | post/{post}      | post.destroy | App\Http\Controllers\PostController@destroy | web        |
|        | GET|HEAD  | post/{post}/edit | post.edit    | App\Http\Controllers\PostController@edit    | web        |
+--------+-----------+------------------+--------------+---------------------------------------------+------------+
```

##ルーティングの制限
全部のrouteを使用しない場合only,exceptを使って使用するrouteを指定できます。
今回は、index,showのみを使用できるようにしてみます。

```web.php
// onlyを使った場合
Route::resource('post', 'PostController')->only([
    'index', 'show'
]);

// exceptを使った場合
Route::resource('post', 'PostController')->except([
  'create', 'store', 'edit', 'update', 'destroy'
]);
```

onlyを使用すると指定した他のroute以外を無効にできます。
expectを使用すると指定したrouteを無効にできます。

結果はどちらも下記のようになります。

```
+--------+----------+-------------+------------+-------------------------------------------+------------+
| Domain | Method   | URI         | Name       | Action                                    | Middleware |
+--------+----------+-------------+------------+-------------------------------------------+------------+
|        | GET|HEAD | post        | post.index | App\Http\Controllers\PostController@index | web        |
|        | GET|HEAD | post/{post} | post.show  | App\Http\Controllers\PostController@show  | web        |
+--------+----------+-------------+------------+-------------------------------------------+------------+
```

個人的にonlyを使用した場合の方が分かり易いと思いました。