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);
}
処理の流れ
$request->validate()で入力値を検証- バリデーション成功 → 検証済みデータが配列で返る
- バリデーション失敗 → 自動的にエラー処理(後述)
👉 $validated には、ルールを通過した安全なデータのみが格納されます。
よく使うルール
| ルール | 意味 |
|---|---|
| required | 必須 |
| nullable | nullを許可 |
| string | 文字列 |
| max | 最大文字数・最大値 |
| min | 最小文字数・最小値 |
| integer | 整数 |
| boolean | 真偽値 |
| メール形式 | |
| 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を正しく使うことで
- 不正データ防止
- セキュリティ向上
- バグ削減
- 保守性・可読性の向上