laravel12.laravel_012
R e i - D r e a m
for Laravel
TOP > Laravel Ver.12 > バリデーション
Guest
login

最終投稿日:2026年2月14日

バリデーション
サンプル環境作成
コントローラの大きな役割のひとつとして、フォームからの入力チェック。いわゆる「バリデーション」があります。
バリデーションの紹介の前に、まずはビュー側にフォームとエラー内容を表示する仕組みを作成します。
任意のビューへ以下を貼り付けてください(BODY部)。
~\resources\views\{任意}.blade.php

<form method="POST">
    @csrf

    @if ($errors->any())
        @foreach ($errors->all() as $error)
            <div style="color:red;">{{ $error }}</div>
        @endforeach
    @endif
    <BR />
    @error('hoge')
        <div class="valid-error">{{ $message }}</div>
    @enderror
    <input type="text" name="hoge" value="{{old('hoge')}}">
    <BR />
    @error('foo')
        <div class="valid-error">{{ $message }}</div>
    @enderror
    <input type="text" name="foo" value="{{old('foo')}}">
    <BR />
    <button type="submit">送信</button>
</form>

上記内容を簡単に説明すると、
@csrf 不正遷移対策の様なものです。POST遷移する場合は必須となります
$errors->any() コントローラからの不特定のバリデーションエラーを感知します
$errors->all() コントローラから取得した全てのエラー配列となります
@error('hoge') コントローラから特定の(この場合は[name属性 = hoge])バリデーションエラーを感知します
次に「GET」「POST」でコントローラのメソッドを分けたいので「~\routes\web.php」で設定してください。
~\routes\web.php

Route::get('/hoge',  [App\Http\Controllers\HogeController::class, 'index'])->name('hoge.index');
Route::post('/hoge', [App\Http\Controllers\HogeController::class, 'mypost'])->name('hoge.mypost');

次にようやくコントローラを構築していきます。
~\app\Http\Controllers\HogeController.php

public function index(Request $request) {
    return view('hoge/index', []);
}
public function mypost(Request $request) {
    //
}

バリデーション作成
関数「mypost」(POST遷移)側にバリデーションを組んでいきます。
バリデーションには以下2種類の方法があります。
○ 関数「$request->validate()」を利用する(お手軽)
○ クラス「Validator」を利用する(自由度が高い)
○ 関数「$request->validate()」を使用
とりあえず何も考えずに以下の様に修正してみてください。
~\app\Http\Controllers\HogeController.php

public function mypost(Request $request) {
    $validated = $request->validate([
        'hoge' => ['required', 'max:10'],
        'foo' => 'required',
    ]);
}

これで完成です。 画面に遷移して、まずはそのまま「送信」してみましょう。
「不特定エラー」「特定エラー」全てのエラーメッセージが以下の様に表示されたハズです。
・The hoge field is required.
・The foo field is required.
次に「hoge」側の項目に任意の11文字を入力し、「送信」を押下してみましょう。
今度は以下の様なエラー内容に変わったハズです。
・The hoge field must not be greater than 10 characters.
○ コントローラの制御内容は以下となります
関数「$request->validate()」は、バリデーションに失敗すると即座に例外(ValidationException)を投げて処理を中断します。
その後、自動でリダイレクト+エラーメッセージをセッションに詰めてくれます。
非常にお手軽なバリデーションとなり、自由度は低いものの場面によっては非常に強力です。
また、バリデーションに成功した場合は、左辺に定義した変数「$validated」に評価した項目の配列が格納されます。
ポイント

ひとつの項目に複数のバリデーション定義をする場合は配列で定義します。

○ クラス「Validator」を使用
クラスを使用する場合は、以下の宣言が必要です。
    use Illuminate\Support\Facades\Validator;
とりあえず何も考えずに以下の様に修正してみてください。
~\app\Http\Controllers\HogeController.php

public function mypost(Request $request) {
    $validator = Validator::make($request->all(), [
        'hoge' => 'required|max:10',
        'foo'  => 'required',
    ]);
    // ダンプ
    var_dump($validator->fails());exit;
}

画面に遷移して、まずはそのまま「送信」してみましょう。
「bool(true)」と表示されるハズです。
先ほどの関数「$request->validate()」とは違い、バリデーション定義を抜け、「exit;」まで到達しています。
そしてエラーありの「true」が画面に表示されています。
クラス「Validator」を使用した場合は、例えバリデーションエラーの場合でも処理は続行される点が大きな違いです。
ポイント

メソッドチェーンで「->validate()」を付与すると、即座に例外が送出されます。

ではエラーだった場合の処理として、以下を追記します。
~\app\Http\Controllers\HogeController.php

public function mypost(Request $request) {
    $validator = Validator::make($request->all(), [
        'hoge' => 'required|max:10',
        'foo' => 'required',
    ]);

    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)->withInput();
    } }

画面に遷移して、まずはそのまま「送信」してみましょう。
エラーメッセージが画面に表示されたハズです。
エラー判定メソッド「fails()」でエラー判定し、エラーの場合は以下内容を画面へ返却する。
redirect()->back() 同画面へれダイレクトする
withErrors($validator) エラー内容関数にエラークラスから受けとった「$validator」を渡す
withInput() 画面に入力した内容も返却する
ポイント

入力内容にエラーがない場合は、以下で入力内容を取得できます。
    $validator->validated()

返却は例えばAPI用のJSONを返却する事もできます。
    if ($validator->fails()) {
        return response()->json([
            'message' => 'バリデーションエラー',
            'errors' => $validator->errors(),
        ], 422);            // HTTPステータス422
    }

エラーメッセージを日本語にしたい
先ほどまでエラー内容が全て英語となっており、非常にユーザーフレンドリーではありません。
多言語化対応で一律に定義する事も可能(ここで確認)ですが、個別に制御する事も可能です。
クラス「Validator」が持つ関数「make」の引数は以下3個あります。
・$request->all()
・$rules
・$messages
この3つ目の引数「$messages」にエラー内容定義を渡す事ができます。
コントローラを以下の様に書き換えます。
~\app\Http\Controllers\HogeController.php

$messages = [
    'hoge.required' => '「HOGE」は必須です!',
    'hoge.max' => '「HOGE」は最大:max文字です!',
    'foo.required' => '「FOO」は必須です!',
];

$validator = Validator::make($request->all(), [
    'hoge' => 'required|max:10',
    'foo' => 'required',
], $messages);

画面に遷移して、まずはそのまま「送信」してみましょう。
エラー内容が日本語になりましたね!!
「$messages」の書式は以下となります。
['{項目名}.{バリデーション名}' => 'エラーメッセージ' ...]
※ バリデーションに引数を持っている場合は「:max」の様にプレースホルダーが使えます
独自エラーチェックを作ろう
バリデーションのおさらい。
バリデーションには、以下2種類の定義方法があります。
・$request->validate()
・Validator::make()
バリデーションを複数定義する場合は、以下の方法があります。
・'hoge' => ['required', 'max:10'],
・'hoge' => 'required|max:10',
※ 配列で定義するか、パイプ(|)で文字列を区切るかです
バリデーションの種類は複数用意されていますが、どうしても独自のルールが必要なケースが存在します。
その場合は無名関数を使用する事で定義が可能です。
先ほどの定義に独自ルールを追加した場合は以下となります。
~\app\Http\Controllers\HogeController.php

'hoge' => ['required', 'max:10', function ($attribute, $value, $fail) {
        if ($value == 'foo') {
            $fail('ここは[' . $attribute . ']だっ!!');
        }
    }],

上記定義で項目「hoge」は以下のルールとなります。
・必須
・最大10文字
・[foo]と入力できない
    ※ [$attribute]には項目名である「hoge」が入ります
独自エラー制御を拡張しよう(カスタムバリデーション)
個々のコントローラにチクチクと独自バリデーションを定義すると可読性が失われます。
そこで独自のルールをまとめたクラスを作成します。
作成には[artisan]コマンドを使用しますので、以下を叩いてください。
[artisan]コマンド

C:\~\laravel_12>php artisan make:rule UppercaseRule
    INFO  Rule [C:\~\laravel_12\app\Rules\UppercaseRule.php] created successfully.

C:\~\laravel_12>

「~\app\Rules\UppercaseRule.php」が作成されます。
少し整理しましたが、「UppercaseRule」クラスは以下の様な内容となります。
~\app\Rules\UppercaseRule.php

<?php
    namespace App\Rules;
    use Closure;
    use Illuminate\Contracts\Validation\ValidationRule;
    class UppercaseRule implements ValidationRule {
        public function validate(string $attribute, mixed $value, Closure $fail): void {
            //
        }
    }

ここに独自ルールを以下の様に作成します。
~\app\Rules\UppercaseRule.php

<?php
    namespace App\Rules;
    use Closure;
    use Illuminate\Contracts\Validation\ValidationRule;
    class UppercaseRule implements ValidationRule {
        public function validate(string $attribute, mixed $value, Closure $fail): void {

            if ($value == 'hoge') {
                fail('ここは[' . $attribute . ']だっ!!');
            }
        }
    }

これで独自ルールは完成しました。
コントローラ側に独自ルールを適用する場合、先ずは「Rules」クラスを宣言します。
    use App\Rules\UppercaseRule;
コントローラ側で独自ルールを適用したいバリデーション定義を以下の様にします。
    'hoge' => ['required', new UppercaseRule],
上記設定で「必須」「独自」ルールが適用されます。
独自エラー制御と「FormRequest」クラスでバリデーションのコードを隠蔽しよう
以下お手軽バリデーションの挙動となります。
    $request->validate()
コントローラなどは、コードが煩雑になりがちです。
そこで、バリデーションのコードを隠蔽してコードをスッキリさせましょう。
まずはフォームに対応する様なクラスを[artisan]コマンドを使い叩きます。
[artisan]コマンド

C:\~\laravel_12>php artisan make:request HogeRequest
INFO  Request [C:\~\app\Http\Requests\HogeRequest.php] created successfully.

C:\~\laravel_12>

「~\app\Http\Requests\HogeRequest.php」が作成されます。
少し整理しましたが、作成時の内容は以下となります。
app\Http\Requests\HogeRequest.php

<?php
    namespace App\Http\Requests;
    use Illuminate\Foundation\Http\FormRequest;
    class HogeRequest extends FormRequest {
        public function authorize(): bool {
            return false;
        }
        public function rules(): array {
            return [
                //
            ];
        }
    }

バリデーションを追加するため2つのメソッドを修正します。
app\Http\Requests\HogeRequest.php

<?php
    namespace App\Http\Requests;
    use Illuminate\Foundation\Http\FormRequest;
    class HogeRequest extends FormRequest {
        public function authorize(): bool {
            return
true;
        }
        public function rules(): array {
            return [

                'hoge' => ['required',  new UppercaseRule],
                'foo' => ['nullable'],
            ];
        }
    }

○ 関数「authorize」
権限チェックです。
[false]とすると、[403]エラーとなります。
[true]とするとバリデーションを実行します。
○ 関数「rules」
バリデーション内容です。
例では、[UppercaseRule]クラスを呼び出していますが、直接独自ルールも記述できます。
次にコントローラで[HogeRequest]クラスを宣言します。
    use App\Http\Requests\HogeRequest;
つづいて対象メソッドを修正します。
~\app\Http\Controllers\HogeController.php

public function mypost(HogeRequest $request) {
    var_dump($request->validated());exit;            // ダンプ
}

これで完成です。 画面に遷移して、まずはそのまま「送信」してみましょう。
どうですか?「eixt;」が発火せずにバリデーションエラーになりましたよね!!
つまりコントローラには1行もバリデーション関連のコードがない事になります。
設定は超簡単で、今まで関数の引数にしていた「Request $request」を「HogeRequest $request」へ変更するだけです。
ポイント

[HogeRequest]クラス内で、以下メソッドを追加するとメッセージ内容をオーバーライドできます。

    public function messages(): array {
        return [
            'hoge.required' => '駄目!!',
        ];
    }

組込みバリデーション一覧
○ 必須・存在チェック
required 空であってはならない(null、空文字(全角含む)、空配列NG)
required_if:hoge,"aaa" 項目「hoge」の値が「aaa」の場合は必須
required_with:hoge,bar, 項目「hoge」「bar」のいづれかに値が存在する場合は必須(複数指定できる。)
nullable nullを許容(項目が存在しなくてもOK)
filled 項目が存在する場合は必須
○ 必須・存在チェック
string 文字列であること
min:10 最小10文字以上
max:10 最大10文字以下
size:10 ちょうど10文字
alpha 英字のみ
alpha_num 英数字のみ
alpha_dash 英数字とハイフン、アンダースコアのみ
email 有効なメール形式
url 有効なURL形式
regex:/^hoge.*end$/ 正規表現マッチ(例は、[hoge]で始まり[end]で終わる文字列)
○ 数値関連
integer 整数
numeric 数値
digits:5 ちょうど5桁
digits_between:1,5 1〜5桁
gt:10 10を超える事
lt:10 10未満である事
○ 配列・ファイル関連
array 配列であること
in:foo,bar 指定値のいずれか
mimes:jpg,png 指定拡張子のファイル
image 画像ファイル
max:1024 ファイルサイズ最大1MB
○ 配列・ファイル関連
unique:users,email usersテーブルのemailで重複なし
exists:users,id usersテーブルのidが存在する
きっぷる
ログインしてコメントを残そう!!


きっぷる