まずは、ルート定義の「HTTP 動詞」についておさらい。
Laravel では、複数の HTTP 動詞に対応したルートを登録することができます。例えば routes/web.php に
Route::get('/', [SampleController::class, 'index']);
Route::post('/', [SampleController::class, 'post']);
Route::put('/', [SampleController::class, 'put']);
Route::patch('/', [SampleController::class, 'putch']);
Route::delete('/', [SampleController::class, 'delete']);
と、このような感じで、同じ URI でも get , post , put , patch , delete の複数の HTTP 動詞に振り分けてルートを定義することが可能になります。
上記の例では、いずれのルートも / がマッチする URI となっていますが、Route:: の次にくる HTTP 動詞によって、適用されるルートが異なってきます。
GET 動詞が付くルートにアクセスするには
GET 動詞が付くルートにアクセスするには、普通にブラウザから URL を入力すると、GET リクエストでのアクセスとなりますので、GET 動詞の付くルートが適用されます。フォームを使用しなければ、だいたい GET リクエストのアクセスなので想像しやすいと思います。普通に a タグのリンクで遷移するのも GET リクエストです。
POST 動詞が付くルートにアクセスするには
POST 動詞が付くルートにアクセスするには、HTML フォームの method 属性に POST を指定して送信してください。
<form action="/foo/bar" method="POST">
<input type="text" name="hitokoto">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
上記のようにフォームタグの method 属性の値が POST になっています。これによってPOST動詞が定義されているルートが適用されます。
GET & POST 動詞以外の HTTP 動詞が付くルートにアクセスするには?
HTML フォームの method 属性は put、patch、delete をサポートしていません。つまり、フォームタグの method 属性の値として put , patch , delete を指定することができません。なので Laravel は、フォームに _method 隠しフィールドを追加して、疑似的に put、patch、delete のリクエストを表現します。
<form action="/foo/bar" method="POST">
<input type="text" name="hitokoto">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
ちなみに上記コードは Blade ディレクティブを活用することで、さらにシンプルに記述することもできます。_method フィールドを、@method Blade ディレクティブに置き換えてください。
<form action="/foo/bar" method="POST">
<input type="text" name="hitokoto">
@method('PUT')
@csrf
</form>
少しすっきりしたコードになりました(=゚ω゚)ノ