Laravelのバリデーション完全ガイド|指定方法・種類一覧・エラーメッセージの書き方

Laravel
Laravelのバリデーション完全ガイド|書き方・種類一覧・エラーメッセージのカスタマイズ

Laravelのバリデーション完全ガイド|指定方法・ルール一覧・エラーメッセージの書き方

Laravelのフォームバリデーションの書き方・よく使うバリデーションルール・バリデーションメッセージの表示&カスタマイズ方法をまとめました。 コピペでそのまま使えるサンプル付きなので、自分のプロジェクトにすぐ導入できます。

1. Laravelのバリデーションの基本

Laravelでは、ユーザー入力をチェックするためのバリデーション機能が標準で用意されています。 主な書き方は以下の2つです。

  • コントローラで validate() ヘルパを使う方法
  • FormRequest クラス(フォームリクエスト)を使う方法

1-1. コントローラでのシンプルなバリデーション

一番シンプルな書き方は、コントローラ内で $request->validate() を使う方法です。

PHP (Controller)
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // ★ バリデーション
        $validated = $request->validate([
            'name'  => ['required', 'string', 'max:50'],
            'email' => ['required', 'email', 'max:255'],
            'age'   => ['nullable', 'integer', 'min:0'],
        ]);

        // バリデーションOKの場合のみここに来る
        // $validated に検証済みデータが入っている
        // User::create($validated); など
    }
}
ポイント
バリデーションに失敗すると、自動的に前のページにリダイレクトされ、$errors 変数にエラーが入ります。

1-2. FormRequestクラスを使ったバリデーション

バリデーションルールが増えてきたら、FormRequestに切り出すとスッキリします。

Bash
# フォームリクエストの作成
php artisan make:request StoreUserRequest
PHP (FormRequest)
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function authorize(): bool
    {
        // 認可が不要なら true 固定でOK
        return true;
    }

    public function rules(): array
    {
        return [
            'name'  => ['required', 'string', 'max:50'],
            'email' => ['required', 'email', 'max:255', 'unique:users,email'],
            'age'   => ['nullable', 'integer', 'min:0'],
        ];
    }
}
PHP (Controller)
<?php

namespace App\Http\Controllers;

use App\Http\Requests\StoreUserRequest;

class UserController extends Controller
{
    public function store(StoreUserRequest $request)
    {
        // ここに来る時点でバリデーション済み
        $validated = $request->validated();

        // User::create($validated); など
    }
}

2. よく使うバリデーションルール一覧

Laravelには多くのバリデーションルールがありますが、よく使うものを厳選して紹介します。

2-1. 文字列・必須・長さ系

  • required:必須
  • nullable:null を許可
  • string:文字列
  • max:50:最大50文字
  • min:3:最小3文字
PHP
'name' => ['required', 'string', 'min:3', 'max:50'],

2-2. 数値・メールアドレス

  • integer:整数
  • numeric:数値(小数含む)
  • email:メールアドレス形式
  • between:1,100:1〜100 の範囲
PHP
'age'   => ['nullable', 'integer', 'between:0,150'],
'email' => ['required', 'email'],

2-3. ユニーク・確認用(password確認など)

  • unique:users,email:usersテーブルのemail列と重複NG
  • confirmedpasswordpassword_confirmation が一致するか
PHP
'email'    => ['required', 'email', 'unique:users,email'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
コピペで使えるおすすめセット
フォームが増えてきたら、よく使うルールだけでも「自分用テンプレ」としてどこかにまとめておくと便利です。

3. バリデーションメッセージはどこに書く?

バリデーションメッセージは、主に次の3つの場所に書けます。

  1. Blade(ビュー)側で @error を使って表示
  2. FormRequest の messages() / attributes() に書く
  3. 言語ファイル(resources/lang/ja/validation.php)で一括管理

3-1. Bladeでエラーメッセージを表示する

まずは、よくある「フォームの下にエラーメッセージを出す」パターンです。

Blade
<form method="POST" action="{{ route('users.store') }}">
    @csrf

    <div>
        <label for="name">名前</label>
        <input id="name" type="text" name="name" value="{{ old('name') }}">

        @error('name')
            <div style="color: #ef4444; margin-top: 4px; font-size: 13px;">
                {{ $message }}
            </div>
        @enderror
    </div>

    <div>
        <label for="email">メールアドレス</label>
        <input id="email" type="email" name="email" value="{{ old('email') }}">

        @error('email')
            <div style="color: #ef4444; margin-top: 4px; font-size: 13px;">
                {{ $message }}
            </div>
        @enderror
    </div>

    <button type="submit">送信</button>
</form>
ポイント
old('name') としておくと、バリデーションエラーで戻ってきたときに入力値を保持できます。

3-2. FormRequest内にバリデーションメッセージを書く

エラーメッセージをコントローラではなく、FormRequest内にカスタム定義することもできます。

PHP (FormRequest)
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name'  => ['required', 'string', 'max:50'],
            'email' => ['required', 'email', 'max:255', 'unique:users,email'],
        ];
    }

    /**
     * カスタムバリデーションメッセージ
     */
    public function messages(): array
    {
        return [
            'name.required'  => '名前は必須項目です。',
            'name.max'       => '名前は:max文字以内で入力してください。',
            'email.required' => 'メールアドレスは必須項目です。',
            'email.email'    => '正しいメールアドレス形式で入力してください。',
            'email.unique'   => 'このメールアドレスはすでに登録されています。',
        ];
    }

    /**
     * 属性名を日本語にしたい場合
     */
    public function attributes(): array
    {
        return [
            'name'  => '名前',
            'email' => 'メールアドレス',
        ];
    }
}

attributes() を使うと、:attribute となっている部分が自動的に日本語ラベルに置き換わります。

3-3. 言語ファイル(validation.php)で一括管理する

プロジェクト全体で共通のエラーメッセージを使いたい場合は、 resources/lang/ja/validation.php に書くのがおすすめです。

PHP (resources/lang/ja/validation.php)
<?php

return [

    'required' => ':attribute は必須項目です。',
    'email'    => ':attribute は有効なメールアドレス形式で入力してください。',
    'max'      => [
        'string' => ':attribute は :max 文字以内で入力してください。',
    ],

    // ...

    'attributes' => [
        'name'  => '名前',
        'email' => 'メールアドレス',
        'age'   => '年齢',
    ],

];

ここで 'attributes' を設定しておくと、エラーメッセージ内の :attribute が自動的に日本語に置き換わります。

4. まとめ|Laravelのバリデーションをサクッと導入しよう

  • 簡単なフォーム:コントローラの $request->validate() でOK
  • 複雑なフォーム / 画面が増えてきたら:FormRequestに切り出す
  • バリデーションメッセージ:FormRequestの messages() / attributes() または validation.php にまとめる
  • ビュー側@error('フィールド名') でエラーを表示

上のサンプルコードはすべてコピペで使える形になっているので、 まずは1画面だけでも「バリデーション+エラーメッセージ表示」を実装してみてください。

※この記事では「Laravel」「バリデーション」「バリデーションメッセージ」を中心に解説しました。 フォームが増えてきたら、共通ルールやメッセージを共通化して管理しやすくしていきましょう。

コメント

タイトルとURLをコピーしました