Laravel バリデーションの基礎

Laravel

Laravelフレームワークを使用する際、データの正確性を確認するためのバリデーションは極めて重要です。この記事では、Laravelのバリデーション機能について詳しく解説し、実践的な例を通じて理解を深めていきます。

前提

Laravel11系で解説します。

バージョンにより書き方が若干異なる場合があります。

準備

フォームの作成

ユーザー登録フォームを実際に作成してみましょう。以下は、基本的なHTMLフォームの例です。

resources/views/register.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>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            color: #333;
            margin: 0;
            padding: 20px;
        }

        h1 {
            text-align: center;
            color: #4CAF50;
        }

        form {
            max-width: 400px;
            margin: 0 auto;
            background: #fff;
            padding: 20px;
            border-radius: 5px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        label {
            display: block;
            margin-bottom: 10px;
            font-weight: bold;
        }

        input[type="text"],
        input[type="email"],
        input[type="password"] {
            width: 380px;
            padding: 10px;
            margin: 5px 0 20px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }

        button {
            width: 100%;
            padding: 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
        }

        button:hover {
            background-color: #45a049;
        }

        .error {
            color: red;
            font-size: 14px;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>

<h1>ユーザー登録</h1>

<form action="{{ route('register') }}" method="POST">
    @csrf
    <label for="name">名前:</label>
    <input type="text" name="name" id="name" value="{{ old('name') }}">
    @error('name')
        <div class="error">{{ $message }}</div>
    @enderror

    <label for="email">メールアドレス:</label>
    <input type="email" name="email" id="email" value="{{ old('email') }}">
    @error('email')
        <div class="error">{{ $message }}</div>
    @enderror

    <label for="password">パスワード:</label>
    <input type="password" name="password" id="password">
    @error('password')
        <div class="error">{{ $message }}</div>
    @enderror

    <button type="submit">登録</button>
</form>

</body>
</html>

コントローラの設定

次に、フォームデータを処理し、バリデーションを行うコントローラを作成します。

php artisan make:controller RegisterController
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        // バリデーションルールを配列形式で定義
        $validationRules = [
            'name' => [
                'required',
                'string',
                'max:255',
            ],
            'email' => [
                'required',
                'string',
                'email',
                'max:255',
                'unique:users',
            ],
            'password' => [
                'required',
                'string',
                'min:8',
            ],
        ];

        // バリデーションを実行
        $validatedData = $request->validate($validationRules);

        // バリデーション成功後、ユーザーを保存
        $validatedData['password'] = bcrypt($validatedData['password']);
        User::create($validatedData);

        return redirect()->route('register.form');
    }
    public function showRegistrationForm()
    {
        return view('register');
    }
}

ルートの設定

最後に、ルーティングを設定して、フォームの送信先を指定します。web.phpファイルに以下のように記述します。

use App\Http\Controllers\RegisterController;

// ユーザー登録フォームを表示するためのルート
Route::get('/register', [RegisterController::class, 'showRegistrationForm'])->name('register.form');

// ユーザー登録を処理するためのルート
Route::post('/register', [RegisterController::class, 'register'])->name('register');

このように、GETリクエストで登録フォームを表示し、POSTリクエストでフォームを処理するルートを設定します。

マイグレーション

新規に作成するテーブルはありませんが、念の為

php artisan migrate

を流しておきましょう。

動作確認

http://localhost/register

にアクセス。

実際に入力し、ユーザーが登録されることを確認します。

登録を押した後、

フォームから入力したユーザーが登録されていればOKです。

何も入力せずに登録を押すと、

バリデーションエラーが表示されるようになっています。

基礎

Laravelでは、バリデーションのための多くのビルトインルールが提供されています。これにより、フォームから送信されるデータが正しい形式であるかどうかを簡単に確認できます。

saku
saku

業務で使用する大半のルールは用意されているので、

基本的には下記のルールを使用します。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing you to create without sweating the small...

基本的な使用方法

コントローラ内でバリデーションを行う際は、validateメソッドを使用します。以下に基本的な例を示します。

public function store(Request $request)
{
        $validationRules = [
            'name' => [
                'required',
                'string',
                'max:255',
            ],
            'email' => [
                'required',
                'string',
                'email',
                'max:255',
                'unique:users',
            ],
            'password' => [
                'required',
                'string',
                'min:8',
            ],
        ];

        // バリデーションを実行
        $validatedData = $request->validate($validationRules);
}

上記の例では、nameemailpasswordフィールドについてバリデーションルールが設定されています。

  • required: フィールドが必須であることを指定します。ユーザーがこのフィールドを空のまま送信した場合、バリデーションに失敗します。
  • string: フィールドが文字列であることを確認します。
  • email: 入力された値が有効なメールアドレス形式であることを確認します(例えば、user@example.comのような形式)。形式が間違っていると、バリデーションに失敗します。
  • max:255: フィールドの最大許容文字数を255文字に制限します。
  • unique:usersusersテーブル内で、このメールアドレスがユニークであることを確認します。同じメールアドレスがすでに存在する場合、バリデーションに失敗します。
  • min:8: パスワードが最小8文字であることを要求します。8文字未満のパスワードを入力すると、バリデーションに失敗します。

エラー表示

ビュー内でエラーメッセージを表示するために、@error ディレクティブや session('errors') を使用します。具体的には、次のようなコードが使われます。

<label for="name">名前:</label>
<input type="text" name="name" id="name" value="{{ old('name') }}">
@error('name')
    <div style="color: red;">{{ $message }}</div>
@enderror
  • @error('name'): これは、name フィールドに関連するエラーが存在する場合に、そのエラーメッセージを表示します。エラーメッセージは、コントローラでバリデーションルールが失敗した際に自動的にセッションに保存された内容から取得されます。
  • old('name'): これは、バリデーションエラーが発生した場合にも、ユーザーが入力していた内容をフォームに再表示するために使われます。

バリデーションエラーメッセージのカスタマイズ

Laravelでは、バリデーションエラー時に表示されるメッセージをカスタマイズすることも容易です。以下は、その方法です。

$messages = [
    'name.required' => '名前を入力してください',
    'name.string' => '名前は文字列で入力してください',
    'name.max' => '名前は255文字以内で入力してください',
    'email.required' => 'メールアドレスを入力してください',
    'email.string' => 'メールアドレスは文字列で入力してください',
    'email.email' => 'メールアドレスの形式で入力してください',
    'email.max' => 'メールアドレスは255文字以内で入力してください',
    'email.unique' => 'そのメールアドレスは既に登録されています',
    'password.required' => 'パスワードを入力してください',
    'password.string' => 'パスワードは文字列で入力してください',
    'password.min' => 'パスワードは8文字以上で入力してください',
];

// バリデーションを実行
$validatedData = $request->validate($validationRules, $messages);

validateメソッドの第二引数に、エラーメッセージを定義した配列を追加します。

これで、エラーメッセージを独自のものに変更できます。

カスタムバリデーション

Laravelでは、独自のバリデーションルールを作成することも可能です。以下は、カスタムバリデーションルールを作成する手順です。

手順

新しいルールを作成する

Artisanコマンドを使用して新しいバリデーションルールを作成します。

php artisan make:rule NoNumbers

ルールを定義する

作成されたNoNumbersクラスのvalidateメソッドを編集して、条件を定義します。

<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class NoNumbers implements ValidationRule
{
    /**
     * Run the validation rule.
     *
     * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
     */
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        if (preg_match('/\d/', $value)) {
            $fail('The :attribute must not contain numbers.');
        }
    }
}

ifの中で失敗する条件を書き、$fail(エラーメッセージ)の形で定義します。

:attributeの部分は、フォームのname属性の値が入ります。

Laravel 9.x以前と、10.x以降では書き方が異なります。この記事では10.x以降で使う、新しい書き方で説明しています。

ルールを使用する

コントローラ内でこのカスタムバリデーションルールを使用します。

use App\Rules\NoNumbers;

public function store(Request $request)
{
        $validationRules = [
            'name' => [
                'required',
                'string',
                'max:255',
                new NoNumbers(), // 追加
            ],
            .....
}

動作確認

このようにして、入力ルールを独自で作成できます。

まとめ

Laravelのバリデーション機能は、データの整合性を保つための強力なツールです。この記事では、バリデーションの基本的な使用法やカスタムルールの作成、エラーメッセージのカスタマイズ方法について説明しました。これらの知識を活用して、より堅牢で信頼性の高いアプリケーションを構築してください。