Laravel:Route::resourceの「only」と「except」でリクエストを制限する

Laravelルーティングでは「Route::resource」で指定することがあります。
「Route::resource」を指定するとCRUDのルーティングを1つの定義で行うことが可能になります。

一つ一つルーティングの指定を書いてもいいのですが、場合によっては「Route::resource」で指定した方がソースコードもスッキリし、可読性が上がるかもしれません。

ただ、不要なメソッドもあると思うので、その場合は「only」と「except」を使用し、不要なルーティングを制限することができます。
今回は「Route::resource」を使用した時の「only」と「except」の使用方法についてメモします。


Route::resourceの使い方

Laravelのルーティングの指定は「routes」ディレクトリ内のファイルに記載します。
※下記が例として「routes/web.php」に書いてる場合。

基本的な書き方

Route::resource('photos', 'PhotoController');

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

+-----------+---------------------------+--------------------+------------+
| Method    | URI                       | Name               | Action     |
+-----------+---------------------------+--------------------+------------+
| GET       | /photos                   | photos.index       | index      |
| GET       | /photos/create            | photos.create      | create     |
| POST      | /photos                   | photos.store       | store      |
| GET       | /photos/{photo}           | photos.show        | show       |
| GET       | /photos/{photo}/edit      | photos.edit        | edit       |
| PUT/PATCH | /photos/{photo}           | photos.update      | update     |
| DELETE    | /photos/{photo}           | photos.destroy     | destroy    |
+-----------+---------------------------+--------------------+------------+

次のコマンドを実行すれば現在のルーティングを一覧で表示することができます。
ターミナルからコンテナ内で下記を実行。

php artisan route:list

使わないメソッドに関してはメソッドを消しているとエラーが起きてしまうので、ルーティングを制限しておく必要があります。
その際に「only」と「except」を使用します。

 


「only」で使用するメソッドを指定

「only」で指定した場合、記述したメソッドのみリクエストすることが可能になります。

onlyを使用した場合の例

Route::resource('photos', 'PhotoController', ['only' => ['index','show']]);

上記の例では「index」と「show」のみ許可しています。

+-----------+---------------------------+--------------------+------------+
| Method    | URI                       | Name               | Action     |
+-----------+---------------------------+--------------------+------------+
| GET       | /photos                   | photos.index       | index      |
| GET       | /photos/{photo}           | photos.show        | show       |
+-----------+---------------------------+--------------------+------------+

 

「except」で使用しないメソッドを指定

「except」で指定した場合、記述したメソッド以外のリクエストが可能になります。
なので、除外したいメソッドを記述します。

exceptを使用した場合の例

Route::resource('photos', 'PhotoController', ['except' => ['edit','create']]);

上記の例では「edit」と「create」以外のリクエストを許可している形になります。

+-----------+---------------------------+--------------------+------------+
| Method    | URI                       | Name               | Action     |
+-----------+---------------------------+--------------------+------------+
| GET       | /photos                   | photos.index       | index      |
| POST      | /photos                   | photos.store       | store      |
| GET       | /photos/{photo}           | photos.show        | show       |
| PUT/PATCH | /photos/{photo}           | photos.update      | update     |
| DELETE    | /photos/{photo}           | photos.destroy     | destroy    |
+-----------+---------------------------+--------------------+------------+

 


今回はLaravelルーティングで「Route::resource」を使用した時の「only」と「except」の使用方法について記載しました。
この辺りを理解しておくとルーティングの記述を綺麗にまとめることができると思います。