バリデーションで入力をチェックする
空欄や不正な入力を防ぐ「バリデーション」の基本と、エラーメッセージや入力値を画面に戻す方法を学びます。
広告枠(記事上)— 本番では AdSense 広告が表示されます
前の単元では、フォームの値を受け取って保存しました。しかし今のままでは、タイトルが空でも送信できてしまいます。「必ず入力してほしい」「メールアドレスの形式でなければダメ」といったチェックを行うのが バリデーション(入力検証) です。
バリデーションを書く
コントローラで $request->validate() を使い、ルール(条件)を指定します。
public function store(Request $request)
{
$validated = $request->validate([
'title' => ['required', 'max:255'],
'body' => ['required'],
]);
\App\Models\Post::create($validated);
return redirect('/posts');
}
required… 必須(空はダメ)max:255… 255文字まで
ルールに合格すれば、検証済みの値が $validated に入ります。合格しなかった場合は、Laravel が自動的に元のフォーム画面へ戻し、続きの処理は実行されません。 つまり、不正なデータが保存されることはありません。
よく使うルール
| ルール | 意味 |
|---|---|
required | 必須 |
max:255 | 最大文字数 |
min:3 | 最小文字数 |
email | メールアドレスの形式 |
numeric | 数値 |
unique:users | 重複を許さない(例: 同じメールは登録済み不可) |
エラーメッセージを表示する
検証に失敗してフォームに戻ったとき、何がダメだったかを画面に出します。Blade では、各項目のエラーを @error で表示できます。
<input type="text" name="title" value="{{ old('title') }}">
@error('title')
<p style="color: red;">{{ $message }}</p>
@enderror
@error('title') … @enderror… title にエラーがあれば中身を表示。$messageにメッセージが入る。old('title')… さっき入力した値を復元する。これがないと、エラーのたびに入力が全部消えてしまい、ユーザーがストレスを感じます。
すべてのエラーをまとめて出すこともできます。
@if ($errors->any())
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
エラーメッセージを日本語にしたい
初期状態では、エラーメッセージは英語で表示されます。日本語にする手順は、別記事で詳しく解説しています。
→ Laravelのバリデーションエラーメッセージを日本語化する方法
まとめ
- バリデーションは、空欄や不正な入力を防ぐ入力チェック。
- コントローラで
$request->validate([...])にルールを書く。失敗すると自動で前の画面に戻る。 - ルールは
required/max/email/uniqueなど。 - 画面では
@errorでメッセージを、old()で入力値を復元する(UXに重要)。 - メッセージの日本語化は専用記事を参照。
- 次の単元では、バリデーションを専用クラスに整理する「フォームリクエスト」を学びます。
広告枠(記事下)— 本番では AdSense 広告が表示されます