0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フォームでよく使うBlade構文(@csrf, @method, old())まとめ

Posted at

はじめに

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>

⑤まとめ

  • @csrf
    → フォーム送信のCSRF対策

  • @method()
    → PUT/DELETEなどのHTTPメソッドを擬似送信

  • old()
    → フォーム再表示時に入力値を保持

Laravelでフォームを扱う上で、これらは基本中の基本。
理解しておくことで、実務でもスムーズに開発できるようになります!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?