まずは、ルート定義の「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>
少しすっきりしたコードになりました(=゚ω゚)ノ