L

バリデーションで入力をチェックする

空欄や不正な入力を防ぐ「バリデーション」の基本と、エラーメッセージや入力値を画面に戻す方法を学びます。

広告枠(記事上)— 本番では 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 広告が表示されます