バリデーション

記事の内容

概要

バリデーションは、フォーム入力やデータ保存時に、データが適切であることを保証するために使用されます。

validateメソッド

コントローラーでリクエストデータを検証し、不正なデータがあればエラーメッセージを返します。

【ファイル先】app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;
use Exception;

class UserController extends Controller
{
    public function store(Request $request)
    {
        // トランザクションの開始
        DB::beginTransaction();

        try {
            // バリデーション
            $validatedData = $request->validate([
                'name' => 'required|string|max:255',
                'email' => 'required|email|unique:users,email',
                'password' => 'required|min:8|confirmed',
            ]);

            // 検証が成功した場合、データを保存します
            User::create($validatedData);

            // トランザクションをコミット
            DB::commit();

            return redirect()->route('sample')->with('success', 'ユーザーが作成されました');
        } catch (ValidationException $e) {
            // バリデーションエラーが発生した場合、トランザクションをロールバック
            DB::rollBack();
            // エラーメッセージをログに記録
            Log::error('バリデーションエラー: ' . json_encode($e->errors()));
            // エラーメッセージを表示
            return redirect()->back()->withErrors($e->errors())->withInput();
        } catch (Exception $e) {
            // それ以外の例外が発生した場合、トランザクションをロールバック
            DB::rollBack();
            // 例外の詳細をログに記録
            Log::error('ユーザー作成エラー: ' . $e->getMessage());
            // エラーメッセージを表示
            return redirect()->back()->with('error', 'ユーザー作成中にエラーが発生しました。')->withInput();
        }
    }
}

表示(フラッシュ)

【ファイル先】resources/views/sample.blade.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ユーザー作成</title>
    <!-- BootstrapなどのCSSを読み込む -->
    <link href="CDNのURL" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <h1>ユーザー作成フォーム</h1>

        <!-- フラッシュメッセージの表示 -->
        @if (session('success'))
            <div class="alert alert-success">
                {{ session('success') }}
            </div>
        @endif

        <!-- バリデーションエラーメッセージの表示 -->
        @if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li> <!-- ここで各エラーメッセージをリスト項目として表示 -->
                    @endforeach
                </ul>
            </div>
        @endif

        <!-- ユーザー作成フォーム -->
        <form action="{{ route('user.store') }}" method="POST">
            @csrf
            <div class="mb-3">
                <label for="name" class="form-label">名前</label>
                <input type="text" class="form-control" id="name" name="name" required>
            </div>
            <div class="mb-3">
                <label for="email" class="form-label">メールアドレス</label>
                <input type="email" class="form-control" id="email" name="email" required>
            </div>
            <div class="mb-3">
                <label for="password" class="form-label">パスワード</label>
                <input type="password" class="form-control" id="password" name="password" required>
            </div>
            <div class="mb-3">
                <label for="password_confirmation" class="form-label">パスワード(確認用)</label>
                <input type="password" class="form-control" id="password_confirmation" name="password_confirmation" required>
            </div>
            <button type="submit" class="btn btn-primary">作成</button>
        </form>
    </div>

    <!-- BootstrapなどのJSを読み込む -->
    <script src="CDNのURL"></script>
</body>
</html>

フォームリクエストクラス

リクエストデータのバリデーションを専用に行うクラスになります。

ファイル作成

【実行内容】

// フォームリクエスト名を指定
php artisan make:request UserRequest

設定変更

リクエストデータのバリデーションルールを定義し、データの検証を行うクラスです。

【ファイル先】app/Http/Requests/UserRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    /**
     * このリクエストが認証されたユーザーによって許可されているかどうかを判断します。
     *
     * @return bool このリクエストが許可されている場合はtrue、そうでない場合はfalseを返します。
     */
    public function authorize(): bool
    {
        return false;
    }

    /**
     * このリクエストに適用されるバリデーションルールを取得します。
     *
     * @return array 各フィールドに適用するバリデーションルールの配列を返します。
     */
    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|min:8|confirmed',
        ];
    }
}

リクエスト許可の判断

public function authorize(): bool
{
    return false;
}

このメソッドがリクエストの許可を判断することを説明しています。
falseを返す場合、リクエストは拒否されます。

リクエスト許可の判断

public function rules(): array
{
    return [
        //
    ];
}

リクエストに適用するバリデーションルールを定義

バリデーションリクエスト

UserRequestクラスで定義されたルールに基づいて検証が行われます。

【ファイル先】app/Http/Controllers/UserController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests\UserRequest;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Exception;

class UserController extends Controller
{
    public function store(UserRequest $request)
    {
        // トランザクションの開始
        DB::beginTransaction();

        try {
            // バリデーション済みのデータを取得
            $validatedData = $request->validated();

            // データベースに保存する処理
            User::create($validatedData);

            // トランザクションをコミット
            DB::commit();

            // 成功メッセージと共にリダイレクト
            return redirect()->route('sample')->with('success', 'ユーザーが作成されました');
        } catch (Exception $e) {
            // 例外が発生した場合、トランザクションをロールバック
            DB::rollBack();

            // 例外の詳細をログに記録
            Log::error('ユーザー作成エラー: ' . $e->getMessage());

            // エラーメッセージをユーザーに表示
            return redirect()->back()->with('error', 'ユーザー作成中にエラーが発生しました: ' . $e->getMessage())->withInput();
        }
    }
}

バリデーション一覧

ルール説明
accepted同意されていること
active_url有効なURL
after:date指定日付より後
alphaアルファベットのみ
alpha_dashアルファベット数字とダッシュ
alpha_numアルファベット数字
array配列であること
base64_imageBase64画像
before:date指定日付より前
boolean真偽値であること
confirmed確認フィールドと一致
current_password現在のパスワード
date有効な日付であること
digits:value指定桁数の数値
digits_between:min,max指定桁数の範囲内
dimensions画像寸法を指定
distinct配列内でユニーク
email有効なメール形式
ends_with:values指定値で終わる
exists:table,column指定されたテーブルに存在
fileアップロードファイル
image画像ファイル
in:values指定された値のいずれか
integer整数であること
ip有効なIPアドレス
ipv4有効なIPv4アドレス
ipv6有効なIPv6アドレス
json有効なJSON
lt:value指定値より小さい
lte:value指定値以下
max:value最大文字数または上限値
mimes:types指定ファイルタイプ
mimetypes:types指定MIMEタイプ
min:value最小文字数または下限値
multiple_of:value指定値の倍数
not_in:values指定値のいずれでもない
not_regex:pattern指定正規表現に一致しない
nullable空でも可
numeric数値であること
passwordパスワードの強度
present存在すること
regex:pattern指定されたパターンに一致
required必須フィールド
required_if:anotherfield,value条件次第で必須
required_unless:anotherfield,value条件次第で必須
required_with:fields特定フィールドありで必須
required_without:fields特定フィールドなしで必須
size:valueサイズ指定
starts_with:values指定値で始まる
string文字列であること
timezone有効なタイムゾーン
unique:table,column一意の値であること
uuid有効なUUID
記事の内容
閉じる