Tech Starlog

Laravel Validation

投稿日:2026/01/25

  • Laravelには強力なバリデーション機能が標準搭載されており、ユーザー入力やAPIリクエストの安全性・品質を高めることができます。
  • フォーム入力・APIリクエスト・管理画面など、あらゆる入力データの検証を統一的に管理できる点が大きなメリットです。
  • 本記事では、基本的な使い方から実務でよく使う設計パターンまでを解説します。

Validationとは?

Validation(バリデーション)とは、 「送信されたデータが、期待している形式・条件を満たしているか」を検証する仕組みです。

たとえば以下のようなチェックを行います。

  • 必須項目が入力されているか
  • 文字数や数値の範囲が適切か
  • メールアドレス形式か
  • 存在するIDか(外部キー制約)

バリデーションを行う目的

  • 不正データの登録防止
  • セキュリティ向上(XSS・不正値対策)
  • システム障害・例外発生の予防
  • ユーザー体験の向上(エラーを早期に伝える)

基本の書き方(Controller)

シンプルな例

public function store(Request $request)
{
    $validated = $request->validate([
        'title' => 'required|max:255',
        'description' => 'nullable|string',
    ]);

    Task::create($validated);
}

処理の流れ

  1. $request->validate() で入力値を検証
  2. バリデーション成功 → 検証済みデータが配列で返る
  3. バリデーション失敗 → 自動的にエラー処理(後述)

👉 $validated には、ルールを通過した安全なデータのみが格納されます。

よく使うルール

ルール 意味
required 必須
nullable nullを許可
string 文字列
max 最大文字数・最大値
min 最小文字数・最小値
integer 整数
boolean 真偽値
email メール形式
unique 一意制約
exists 外部キー存在チェック
date 日付形式

バリデーションエラー時の挙動

Web画面の場合

  • バリデーション失敗時、自動で元の画面へリダイレクト
  • エラーメッセージが $errors に格納される
  • 入力値は自動的に old() に保存される
@if ($errors->any())
  <ul>
    @foreach ($errors->all() as $error)
      <li>{{ $error }}</li>
    @endforeach
  </ul>
@endif

👉 フォームでは old('title') を使うことで入力値の復元が可能です。

APIの場合

  • HTTPステータス 422 Unprocessable Entity が返る
  • JSON形式でエラー内容が返却される
{
  "message": "The title field is required.",
  "errors": {
    "title": [
      "The title field is required."
    ]
  }
}

👉 フロントエンド側で errors.title[0] のように取得して表示できます。


FormRequestを使う(実務では推奨)

  • Controllerに直接バリデーションを書くと、ロジックが肥大化し、可読性・テスト性が低下します。
  • そのため、実務では FormRequest を使ってバリデーションを分離するのが一般的です。

FormRequest作成

php artisan make:request StoreTaskRequest

ルール定義

public function rules()
{
    return [
        'title' => 'required|max:255',
        'description' => 'nullable|string',
    ];
}

authorize() メソッドは、必要に応じて権限チェックに使用できます。

public function authorize()
{
    return true;
}

Controllerで使用

public function store(StoreTaskRequest $request)
{
    Task::create($request->validated());
}

👉 Controllerがスッキリし、バリデーションルールの再利用・テストが容易になります。


よくあるルール例

unique制約(更新時)

更新時は、自分自身のレコードを除外する必要があります。

'title' => 'required|unique:tasks,title,' . $this->task

Laravel 8以降では以下の書き方も推奨です。

use Illuminate\Validation\Rule;

'title' => [
    'required',
    Rule::unique('tasks', 'title')->ignore($this->task),
],

日付チェック

'start_date' => 'required|date|after:today'

👉 今日以降の日付のみ許可する例です。

数値範囲チェック

'priority' => 'required|integer|min:1|max:5'

外部キー存在チェック

'user_id' => 'required|exists:users,id'

👉 usersテーブルに存在するIDのみ許可されます。


エラーメッセージのカスタマイズ

個別指定

public function messages()
{
    return [
        'title.required' => 'タイトルは必須です。',
    ];
}

属性名の日本語化

public function attributes()
{
    return [
        'title' => 'タイトル',
    ];
}

これにより、

title は必須です。

ではなく、

タイトルは必須です。

のように表示されます。


実務で意識したいポイント(補足)

  • バリデーションは 必ずサーバー側で行う
  • Controllerはできるだけ薄く保つ(FormRequest活用)
  • 更新時の unique 制約の除外漏れに注意
  • APIではエラーフォーマットを統一する
  • フロント側とエラーメッセージの仕様を合わせる

まとめ

Laravel Validationを正しく使うことで

  • 不正データ防止
  • セキュリティ向上
  • バグ削減
  • 保守性・可読性の向上