はじめに
Laravelで開発をしていると、Bladeテンプレート内で以下のようなコードをよく見かけます:
<form action="{{ route('replies.replycompleted', ['id' => $post->id]) }}" method="POST">
「これは何をしているの?」「HTMLの form タグってそもそも何?」と気になったので、LaravelとHTMLの基本をセットで学びなおした内容を備忘録としてまとめてみました。
①HTMLの form タグの基本
まずは、HTMLの form タグについて復習します。
<form action="/送信先URL" method="POST">
<input type="text" name="example">
<button type="submit">送信</button>
</form>
- action 属性:フォームの送信先URL
- method 属性:HTTPメソッド(GET / POSTなど)
- :フォームの入力欄(name属性がキーになる)
- :フォーム送信ボタン
②Laravelでのroute()の使い方
Laravelでは、route() ヘルパーを使って、ルート名からURLを自動生成できます。
例:
action="{{ route('replies.replycompleted', ['id' => $post->id]) }}"
このコードは、routes/web.php に定義されたルートのURLを取得しています。
web.php 側の定義例:
Route::post('/reply/completed/{id}', [ReplyController::class, 'store'])->name('replies.replycompleted');
このようにルート名が 'replies.replycompleted' で、パラメータに id を取るルートに対して、
Blade内で route('replies.replycompleted', ['id' => $post->id]) を使うことで、以下のようなURLが生成されます:
/reply/completed/5
(※ $post->id が5だった場合)
③method=“POST” とCSRF対策
Laravelで method="POST" を使うときは、CSRF(クロスサイトリクエストフォージェリ)対策として、必ず @csrf を入れる必要があります。
<form action="{{ route('replies.replycompleted', ['id' => $post->id]) }}" method="POST">
@csrf
<!-- フォーム内容 -->
</form>
これがないと、Laravel側で「419 Page Expired」エラーになります。
④Bladeテンプレートでの変数展開
- {{ ... }} → 変数や関数の値をHTMLに表示
- route('ルート名', パラメータ配列) → 指定したルートのURLを生成