##概要
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を使用した場合の方が分かり易いと思いました。