Laravelでフォームを作る方法!CSRFトークンの仕組みと基本のフォーム構文
生徒
「Laravelでフォームを作るにはどうすればいいんですか?」
先生
「Laravelでは、Bladeテンプレートを使ってHTMLのフォームを簡単に作れますよ。」
生徒
「フォームを作るときに、CSRFトークンっていうのが必要って聞いたんですけど、それは何ですか?」
先生
「CSRFトークンはセキュリティの仕組みのひとつです。フォームを安全に送信するために必要なんですよ。詳しく見ていきましょう。」
1. Laravelでフォームを作る理由とは?
Webアプリケーションでは、ユーザーから名前やメールアドレス、問い合わせ内容などを入力してもらう場面がとても多くあります。このときに使われるのがフォームです。フォームは、画面とサーバーのあいだでデータをやり取りするための入口のような役割を持っています。
たとえば、次のようなシンプルなHTMLフォームをイメージすると分かりやすいです。
<form>
<label for="name">お名前:</label>
<input type="text" id="name" name="name">
<label for="email">メールアドレス:</label>
<input type="email" id="email" name="email">
<button type="submit">送信</button>
</form>
ユーザーはこの入力フォームに文字を入れて「送信」ボタンを押します。すると、ブラウザからサーバーにデータが送られ、サーバー側(Laravel)がその内容を受け取り、保存したりメールを送ったりといった処理を行います。会員登録フォーム、ログインフォーム、問い合わせフォームなど、身近な機能はほとんどフォームから始まります。
Laravelを使うと、このようなフォームをBladeテンプレートという仕組みで分かりやすく記述できるうえ、フォーム送信時のバリデーション(入力チェック)やセキュリティ対策も組み込み機能で扱いやすくなります。素のHTMLだけでフォームを作るよりも、Laravelの機能を活用したほうが、実践的なWebアプリを安全かつ効率的に開発しやすくなる、というのがフォームをLaravelで作る大きな理由です。
2. フォームの基本構文
LaravelでHTMLフォームを作るときは、まず土台になるのが<form>タグです。このformタグの中に、名前やメールアドレスを入力するinputタグ、送信ボタンとなるbuttonタグなどを並べていきます。LaravelではBladeテンプレートの中に、通常のHTMLと同じようにこれらのタグを書いていくイメージです。
たとえば、名前だけを送信するシンプルなフォームは次のように書けます。
<form action="/submit" method="POST">
@csrf
<label for="name">名前:</label>
<input type="text" id="name" name="name">
<button type="submit">送信</button>
</form>
ここでよく使われる属性が、actionとmethodです。action="/submit"は「どのURLにデータを送るか」、method="POST"は「どの方法でデータを送るか」を表しています。フォームに入力された値は、この設定にしたがってLaravelのルートやコントローラに届けられます。
また、フォームの中に書かれている@csrfという1行にも注目してください。これはLaravel独自の書き方で、フォーム送信時に使われるCSRFトークンというセキュリティ用の値を自動的に埋め込んでくれます。詳しい仕組みは後のセクションで取り上げますが、「LaravelでフォームをPOST送信するときは必ず一緒に書いておくもの」と覚えておくと安心です。
このように、<form>タグとaction・method・入力欄・ボタン、そして@csrfをセットで押さえておくと、Laravelでフォームを作る基本の流れがイメージしやすくなります。
3. CSRFトークンとは?
CSRF(シーエスアールエフ)トークンとは、Cross-Site Request Forgeryの略で、「クロスサイトリクエストフォージェリ」と読みます。名前は難しく聞こえますが、イメージとしては「ユーザーの知らないところで、勝手にフォームを送信されてしまう攻撃」だと考えると分かりやすいです。
たとえば、ユーザーがあるWebサービスにログインしたまま、別の悪意のあるサイトを開いてしまったとします。その悪意のあるサイトに仕込まれたフォームやスクリプトが、自動的に送金処理やアカウント変更のリクエストを送ってしまうと、ユーザー本人はボタンを押していないのに「正規ユーザーからのリクエスト」に見せかけて処理が実行されてしまう危険があります。これがCSRF攻撃です。
この問題を防ぐために使われるのがCSRFトークンです。CSRFトークンは、「そのフォームが本当に自分のサイトから表示されたものかどうか」を確認するための合言葉のようなものです。Laravelはフォームを表示するときに、ランダムな文字列(トークン)をセッションに保存し、同じ値をフォームの中にも埋め込んでおきます。
Bladeテンプレートでは、次のように@csrfと書くだけでOKです。
<form action="/submit" method="POST">
@csrf
<label for="name">名前:</label>
<input type="text" id="name" name="name">
<button type="submit">送信</button>
</form>
@csrfと書くと、実際には次のような隠し入力フィールドが自動的に挿入されます。
<input type="hidden" name="_token" value="ランダムな文字列が入る">
フォームが送信されると、サーバー側のLaravelは「セッションに保存しているトークン」と「フォームから送られてきたトークン」を照らし合わせて、本当に正しい画面から送られたリクエストかどうかをチェックします。値が一致しなければ不正なリクエストとして拒否されるため、外部サイトからの勝手な送信を防ぐことができます。
Laravelでは、POST・PUT・DELETEのようなデータを変更する送信には必ず@csrfが必要になります。フォームを作るときは、「データを送信する=CSRFトークンも一緒に送る」というセットで覚えておくと、安全なフォームを作りやすくなります。
4. フォーム送信先のルート設定
フォームを作っただけでは、まだデータはどこにも届きません。action属性に書いたURLに対して、「このURLにリクエストが来たらどの処理を実行するか」をLaravel側であらかじめ登録しておく必要があります。これがルート(ルーティング)の設定です。
ルートは、プロジェクト内のroutes/web.phpというファイルにまとめて書いていきます。イメージとしては、「URLの一覧表」と「それぞれに対応する担当の窓口(メソッド)」を対応付けておく住所録のような役割です。
たとえば、フォームのaction="/submit"に合わせて、次のようなルートを登録します。
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\FormController;
Route::post('/submit', [FormController::class, 'submit']);
このコードは、「/submitというURLに対して、HTTPメソッドがPOSTのリクエストが来たら、FormControllerクラスのsubmitメソッドを実行する」という意味になります。フォーム側でmethod="POST"と書いていたのは、このRoute::post()と組み合わせて使うためです。
Route::post()のように、HTTPメソッドごとにRoute::get()、Route::put()などの書き方がありますが、フォーム送信でよく使うのはpostです。まずは「フォームのactionとmethodの組み合わせ」と「ルートのURLとHTTPメソッド」がペアになっている、という関係を押さえておくと理解しやすくなります。
このルート設定をしておくことで、ブラウザから送られてきたフォームデータは、迷子にならずに正しい処理へと届きます。次のセクションで、このルートを通じて実際にデータを受け取る流れを見ていきます。
5. コントローラでフォームデータを受け取る
フォームから送信されたデータは、Laravelのコントローラで受け取ります。コントローラは、ユーザーから届いた情報を整理したり、画面に渡したりする「受付係」のような存在です。フォームに入力された値は、Requestオブジェクトを通して簡単に取得できます。
たとえば、名前を送信するシンプルなフォームを受け取る場合、次のようなメソッドを用意します。
public function submit(Request $request)
{
// フォームから送られた「name」の値を取り出す
$name = $request->input('name');
// 受け取った値をビューに渡して表示する
return view('thanks', ['name' => $name]);
}
$request->input('name')という書き方で、フォームのname属性に入っている値を取り出すことができます。とてもシンプルですが、どのフォームでも同じやり方で受け取ることができるため、初心者でも覚えやすいポイントです。
また、このコントローラで取得した情報は、画面に表示するだけでなく、データベースに保存したり、メールを送信したりといった処理にもつなげられます。まずは、この「フォーム → コントローラ → ビュー」という基本的な流れを理解しておくと、Laravelのフォーム処理全体がぐっと分かりやすくなります。
6. Bladeテンプレートで確認メッセージを表示
送信後の画面(thanks.blade.phpなど)では、ユーザーの入力を表示することもできます。
<h2>{{ $name }}さん、送信ありがとうございます!</h2>
7. 入力欄の種類と使い分け
フォームでは、テキスト以外にも色々な入力欄が使えます。以下に代表的なHTML入力タグを紹介します。
<input type="text">:1行の文字入力欄<input type="email">:メールアドレス入力欄<input type="password">:パスワード入力欄<textarea></textarea>:複数行のテキスト入力欄<select></select>:プルダウンメニュー<input type="checkbox">:チェックボックス<input type="radio">:ラジオボタン
8. POST以外のメソッドを使う場合
フォームでPUTやDELETEといったHTTPメソッドを使いたいときは、Bladeテンプレート内で@method()ディレクティブを使います。
<form action="/delete" method="POST">
@csrf
@method('DELETE')
<button type="submit">削除</button>
</form>
まとめ
Laravelでフォームを扱うということは、Webアプリケーションの基礎となる「ユーザー入力」を安全に処理するための重要な仕組みを理解することにつながります。 今回の記事では、Bladeテンプレートでのフォーム作成方法、CSRFトークンの役割、フォーム送信先のルート設定、コントローラでのデータ受け取り、入力内容の表示など、 フォーム処理に必要な流れをひとつずつ整理してきました。特に、LaravelのCSRFトークンはセキュリティ対策として必須の存在であり、初心者の段階から正しい使い方を身につけておくことは非常に大切です。
フォームは、ただ画面を作って送信ボタンを押すだけの仕組みに見えて、実際には「入力の検証」「送信データの受け取り」「安全な通信」「エラーメッセージの表示」など、さまざまな要素が絡み合って成り立っています。 Laravelはこれらの処理を開発者が簡単に扱えるように整備しており、HTMLのフォームタグに少しLaravelの仕組みを加えるだけで、安全で拡張性の高いフォームを構築できます。 このような利便性こそが、Laravelが幅広い層から支持されている理由のひとつです。
初心者にとって最も嬉しい点は、複雑に見えるセキュリティ対策や入力制御が「最低限の記述」で自然に扱えてしまうという点でしょう。
CSRFトークンはその代表的な例であり、@csrfと書くだけで高い安全性が確保され、外部からの悪意ある攻撃を避けることができます。
実際の現場でもCSRF対策は必須のため、Laravelが提供する標準機能を正しく理解しておくことは、実務的なスキルとしても非常に価値があります。
■ フォーム理解を深める実用的なサンプル
ここでは、入力チェックとメッセージ表示まで含んだ少し発展的なフォーム例を紹介します。 Laravelのフォーム構築がどう役立つのか、実際のアプリケーションを意識しながら確認してみましょう。
<form action="/feedback" method="POST">
@csrf
<label for="message">ご意見:</label>
<textarea id="message" name="message"></textarea>
<button type="submit">送信</button>
</form>
// コントローラ例
public function feedback(Request $request)
{
$request->validate([
'message' => 'required|min:5',
]);
return view('feedback_thanks', ['msg' => $request->message]);
}
<!-- Bladeテンプレート例 -->
<h2>いただいたご意見:</h2>
<p>{{ $msg }}</p>
このように、フォーム送信から処理、画面表示までの流れを一度通して経験すると、Laravelが「フォーム入力を扱うための強力なフレームワーク」であることがより理解しやすくなります。 また、バリデーションも簡潔に書けるため、入力エラー時の処理も自然と実装できるようになります。
■ フォームを扱ううえで覚えておきたい要点
Laravelでフォームを作る際に大切な点を整理すると、次のようなポイントが挙げられます。
- フォーム作成はBladeテンプレートで簡単に構築できる。
@csrfはPOST送信に必ず必要な重要な仕組み。- ルート設定はフォーム送信先と必ず一致させる。
- コントローラでのデータ受け取りは
$requestを使う。 - Bladeテンプレートで入力内容を安全に表示できる。
- 必要に応じて、バリデーションルールを加えることで品質向上が可能。
これらのポイントを理解しておけば、ユーザーからの入力を受け取って処理する基本的なWebアプリケーションはすぐに作れるようになります。 フォームは多くのアプリで欠かせない機能であり、一度仕組みを理解しておくことで、今後の開発にも確かな自信がついていきます。
また、Laravelは「開発者にやさしいフレームワーク」であるため、フォームに関連する機能は今後もどんどん便利になっていきます。 これから学習を進める際も、今回の知識がしっかり土台となってくれるはずです。
生徒
「フォームってただ入力して送るだけだと思っていましたが、CSRFトークンがとても大事なんですね!」
先生
「その通りです。安全なフォームを作るには欠かせない仕組みなので、Laravelが自動でやってくれるのは本当に助かります。」
生徒
「Bladeでのフォーム作成も思っていたより簡単でした。これなら実際に何か作れそうな気がします!」
先生
「基礎が分かれば応用もしやすいですよ。今後はバリデーションやセッションも組み合わせて、さらに便利なフォームを作っていきましょう。」
生徒
「はい!Laravelのフォーム作りが楽しくなってきました!」