記事の内容
概要
バリデーションは、フォーム入力やデータ保存時に、データが適切であることを保証するために使用されます。
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;
}
リクエスト許可の判断
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_image | Base64画像 |
before:date | 指定日付より前 |
boolean | 真偽値であること |
confirmed | 確認フィールドと一致 |
current_password | 現在のパスワード |
date | 有効な日付であること |
digits:value | 指定桁数の数値 |
digits_between:min,max | 指定桁数の範囲内 |
dimensions | 画像寸法を指定 |
distinct | 配列内でユニーク |
有効なメール形式 | |
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 |