Laravelのフォーム処理まとめ!安全・拡張性の高い実装法
生徒
「Laravelでフォームを作るとき、安全で拡張性の高い方法はありますか?」
先生
「はい、FormRequestを使ったバリデーション、Bladeテンプレートでの安全な出力、CSRF保護などを組み合わせると安全で拡張性の高いフォームが作れます。」
生徒
「FormRequestって何ですか?」
先生
「FormRequestはフォームの入力内容を検証する専用のクラスで、Controllerがシンプルになり、バリデーションルールを集中管理できます。」
1. FormRequestでバリデーションを管理
Laravelでは、フォームのバリデーションをController内で行うこともできますが、FormRequestを使うとバリデーションルールを別ファイルにまとめられます。これにより、コードが整理され、複数のフォームでも同じルールを使いやすくなります。
php artisan make:request ContactFormRequest
作成されたFormRequest内でルールを定義します。
public function rules()
{
return [
'name' => 'required|string|max:50',
'email' => 'required|email',
'message' => 'required|string|max:1000',
];
}
2. コントローラでFormRequestを利用
ControllerにFormRequestをタイプヒントとして渡すことで、自動的にバリデーションが実行されます。
public function send(ContactFormRequest $request)
{
$data = $request->validated();
// データ保存やメール送信などの処理
}
これにより、Controller内で細かいバリデーションコードを書く必要がなくなります。
3. Bladeテンプレートでの安全なフォーム表示
ユーザーが入力した内容を表示するときは{{ }}を使うと自動でHTMLエスケープされます。これにより、XSS(クロスサイトスクリプティング)攻撃を防ぐことができます。
<input type="text" name="name" value="{{ old('name') }}">
@error('name')
<div class="text-danger">{{ $message }}</div>
@enderror
4. CSRF保護を忘れずに
Laravelではフォームに@csrfを追加することで、CSRFトークンが自動で生成され、不正なリクエストからアプリケーションを守ることができます。
<form method="POST" action="{{ route('contact.send') }}">
@csrf
<!-- フォーム内容 -->
</form>
5. メール送信やデータ保存との組み合わせ
フォーム入力を安全に受け取った後、データベースに保存したり、メールで送信したりすることも可能です。FormRequestでバリデーション済みのデータを使うので、信頼性が高くなります。
\Mail::to('admin@example.com')->send(new ContactMail($data));
\Contact::create($data);
6. 拡張性の高いフォーム設計のポイント
- FormRequestでバリデーションを集約し、Controllerをシンプルに保つ
- Bladeで自動エスケープを利用してセキュリティを確保
- @csrfで不正リクエストを防ぐ
- 多言語対応やカスタムバリデーションも組み込みやすい構造にする
- データ保存やメール送信などの処理もFormRequestを中心に安全に扱う
これらを組み合わせることで、安全で拡張性の高いフォーム処理を実現できます。