はじめに
Laravelでフォームを作成する際に、@csrf
や @method()
, old()
などのBlade構文を頻繁に見かけます。
最初のうちは「これ何だっけ?」と感じることが多かったので、自分の備忘録としてまとめておきます。
① @csrf:フォームのセキュリティ対策
Laravelでは、フォーム送信時に CSRF(クロスサイトリクエストフォージェリ) を防ぐため、@csrf
ディレクティブを使います。
<form action="/submit" method="POST">
@csrf
<input type="text" name="name">
<button type="submit">送信</button>
</form>
- @csrfを入れることで、Laravelは自動的にトークンを生成し、検証してくれます。
- これを省略すると、419エラー (Page Expired) が出るので注意。
②@method:HTMLで使えないHTTPメソッドを送信する
HTMLのフォームは GET と POST しかサポートしていません。
Laravelでは @method() を使うことで、PUT や DELETE などのメソッドを擬似的に送信できます。
<form action="/post/1" method="POST">
@csrf
@method('DELETE')
<button type="submit">削除する</button>
</form>
- 上記は実際には POST ですが、Laravel側では DELETE として扱われます。
③old():フォーム入力の再表示(バリデーションエラー対策)
バリデーションエラーでフォームが再表示されるとき、以前の入力値を保持したい場面があります。
そのときに便利なのが old() ヘルパーです。
<input type="text" name="name" value="{{ old('name', session('name')) }}">
- old('name') がなければ、session('name') の値を使うという書き方も可能です。
実際に使用するとこんな感じ
<form action="{{ route('posts.update', $post->id) }}" method="POST">
@csrf
@method('PUT')
<input type="text" name="title" value="{{ old('title', $post->title) }}" required>
<textarea name="body" required>{{ old('body', $post->body) }}</textarea>
<button type="submit">更新</button>
</form>
⑤まとめ
Laravelでフォームを扱う上で、これらは基本中の基本。
理解しておくことで、実務でもスムーズに開発できるようになります!