バリデーション
サンプル環境作成
バリデーションの紹介の前に、まずはビュー側にフォームとエラー内容を表示する仕組みを作成します。
任意のビューへ以下を貼り付けてください(BODY部)。
<form method="POST">
@csrf
@if ($errors->any())
@foreach ($errors->all() as $error)
<div style="color:red;">{{ $error }}</div>
@endforeach
@endif
<BR />
@error('hoge')
<div class="valid-error">{{ $message }}</div>
@enderror
<input type="text" name="hoge" value="{{old('hoge')}}">
<BR />
@error('foo')
<div class="valid-error">{{ $message }}</div>
@enderror
<input type="text" name="foo" value="{{old('foo')}}">
<BR />
<button type="submit">送信</button>
</form>
| @csrf | 不正遷移対策の様なものです。POST遷移する場合は必須となります |
| $errors->any() | コントローラからの不特定のバリデーションエラーを感知します |
| $errors->all() | コントローラから取得した全てのエラー配列となります |
| @error('hoge') | コントローラから特定の(この場合は[name属性 = hoge])バリデーションエラーを感知します |
Route::get('/hoge', [App\Http\Controllers\HogeController::class, 'index'])->name('hoge.index');
Route::post('/hoge', [App\Http\Controllers\HogeController::class, 'mypost'])->name('hoge.mypost');
public function index(Request $request) {
return view('hoge/index', []);
}
public function mypost(Request $request) {
//
}
バリデーション作成
バリデーションには以下2種類の方法があります。
○ クラス「Validator」を利用する(自由度が高い)
public function mypost(Request $request) {
$validated = $request->validate([
'hoge' => ['required', 'max:10'],
'foo' => 'required',
]);
}
「不特定エラー」「特定エラー」全てのエラーメッセージが以下の様に表示されたハズです。
・The foo field is required.
今度は以下の様なエラー内容に変わったハズです。
その後、自動でリダイレクト+エラーメッセージをセッションに詰めてくれます。
非常にお手軽なバリデーションとなり、自由度は低いものの場面によっては非常に強力です。
また、バリデーションに成功した場合は、左辺に定義した変数「$validated」に評価した項目の配列が格納されます。
use Illuminate\Support\Facades\Validator;
とりあえず何も考えずに以下の様に修正してみてください。
public function mypost(Request $request) {
$validator = Validator::make($request->all(), [
'hoge' => 'required|max:10',
'foo' => 'required',
]);
// ダンプ
var_dump($validator->fails());exit;
}
「bool(true)」と表示されるハズです。
先ほどの関数「$request->validate()」とは違い、バリデーション定義を抜け、「exit;」まで到達しています。
そしてエラーありの「true」が画面に表示されています。
クラス「Validator」を使用した場合は、例えバリデーションエラーの場合でも処理は続行される点が大きな違いです。
メソッドチェーンで「->validate()」を付与すると、即座に例外が送出されます。
public function mypost(Request $request) {
$validator = Validator::make($request->all(), [
'hoge' => 'required|max:10',
'foo' => 'required',
]);
if ($validator->fails()) {
return redirect()->back()->withErrors($validator)->withInput();
}
}
エラーメッセージが画面に表示されたハズです。
エラー判定メソッド「fails()」でエラー判定し、エラーの場合は以下内容を画面へ返却する。
| redirect()->back() | 同画面へれダイレクトする |
| withErrors($validator) | エラー内容関数にエラークラスから受けとった「$validator」を渡す |
| withInput() | 画面に入力した内容も返却する |
入力内容にエラーがない場合は、以下で入力内容を取得できます。
$validator->validated()
返却は例えばAPI用のJSONを返却する事もできます。
if ($validator->fails()) {
return response()->json([
'message' => 'バリデーションエラー',
'errors' => $validator->errors(),
], 422); // HTTPステータス422
}
エラーメッセージを日本語にしたい
多言語化対応で一律に定義する事も可能(ここで確認)ですが、個別に制御する事も可能です。
クラス「Validator」が持つ関数「make」の引数は以下3個あります。
・$rules
・$messages
コントローラを以下の様に書き換えます。
$messages = [
'hoge.required' => '「HOGE」は必須です!',
'hoge.max' => '「HOGE」は最大:max文字です!',
'foo.required' => '「FOO」は必須です!',
];
$validator = Validator::make($request->all(), [
'hoge' => 'required|max:10',
'foo' => 'required',
], $messages);
エラー内容が日本語になりましたね!!
「$messages」の書式は以下となります。
※ バリデーションに引数を持っている場合は「:max」の様にプレースホルダーが使えます
独自エラーチェックを作ろう
バリデーションには、以下2種類の定義方法があります。
・Validator::make()
・'hoge' => 'required|max:10',
※ 配列で定義するか、パイプ(|)で文字列を区切るかです
その場合は無名関数を使用する事で定義が可能です。
先ほどの定義に独自ルールを追加した場合は以下となります。
'hoge' => ['required', 'max:10', function ($attribute, $value, $fail) {
if ($value == 'foo') {
$fail('ここは[' . $attribute . ']だっ!!');
}
}],
・最大10文字
・[foo]と入力できない
※ [$attribute]には項目名である「hoge」が入ります
独自エラー制御を拡張しよう(カスタムバリデーション)
そこで独自のルールをまとめたクラスを作成します。
作成には[artisan]コマンドを使用しますので、以下を叩いてください。
C:\~\laravel_12>php artisan make:rule UppercaseRule
INFO Rule [C:\~\laravel_12\app\Rules\UppercaseRule.php] created successfully.
C:\~\laravel_12>
少し整理しましたが、「UppercaseRule」クラスは以下の様な内容となります。
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class UppercaseRule implements ValidationRule {
public function validate(string $attribute, mixed $value, Closure $fail): void {
//
}
}
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class UppercaseRule implements ValidationRule {
public function validate(string $attribute, mixed $value, Closure $fail): void {
if ($value == 'hoge') {
fail('ここは[' . $attribute . ']だっ!!');
}
}
}
コントローラ側に独自ルールを適用する場合、先ずは「Rules」クラスを宣言します。
use App\Rules\UppercaseRule; コントローラ側で独自ルールを適用したいバリデーション定義を以下の様にします。
'hoge' => ['required', new UppercaseRule], 上記設定で「必須」「独自」ルールが適用されます。
独自エラー制御と「FormRequest」クラスでバリデーションのコードを隠蔽しよう
$request->validate() コントローラなどは、コードが煩雑になりがちです。
そこで、バリデーションのコードを隠蔽してコードをスッキリさせましょう。
まずはフォームに対応する様なクラスを[artisan]コマンドを使い叩きます。
C:\~\laravel_12>php artisan make:request HogeRequest
INFO Request [C:\~\app\Http\Requests\HogeRequest.php] created successfully.
C:\~\laravel_12>
少し整理しましたが、作成時の内容は以下となります。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HogeRequest extends FormRequest {
public function authorize(): bool {
return false;
}
public function rules(): array {
return [
//
];
}
}
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HogeRequest extends FormRequest {
public function authorize(): bool {
return true;
}
public function rules(): array {
return [
'hoge' => ['required', new UppercaseRule],
'foo' => ['nullable'],
];
}
}
[false]とすると、[403]エラーとなります。
[true]とするとバリデーションを実行します。
例では、[UppercaseRule]クラスを呼び出していますが、直接独自ルールも記述できます。
use App\Http\Requests\HogeRequest;
つづいて対象メソッドを修正します。
public function mypost(HogeRequest $request) {
var_dump($request->validated());exit; // ダンプ
}
どうですか?「eixt;」が発火せずにバリデーションエラーになりましたよね!!
つまりコントローラには1行もバリデーション関連のコードがない事になります。
設定は超簡単で、今まで関数の引数にしていた「Request $request」を「HogeRequest $request」へ変更するだけです。
[HogeRequest]クラス内で、以下メソッドを追加するとメッセージ内容をオーバーライドできます。
public function messages(): array {
return [
'hoge.required' => '駄目!!',
];
}
組込みバリデーション一覧
| required | 空であってはならない(null、空文字(全角含む)、空配列NG) |
| required_if:hoge,"aaa" | 項目「hoge」の値が「aaa」の場合は必須 |
| required_with:hoge,bar, | 項目「hoge」「bar」のいづれかに値が存在する場合は必須(複数指定できる。) |
| nullable | nullを許容(項目が存在しなくてもOK) |
| filled | 項目が存在する場合は必須 |
| string | 文字列であること |
| min:10 | 最小10文字以上 |
| max:10 | 最大10文字以下 |
| size:10 | ちょうど10文字 |
| alpha | 英字のみ |
| alpha_num | 英数字のみ |
| alpha_dash | 英数字とハイフン、アンダースコアのみ |
| 有効なメール形式 | |
| url | 有効なURL形式 |
| regex:/^hoge.*end$/ | 正規表現マッチ(例は、[hoge]で始まり[end]で終わる文字列) |
| integer | 整数 |
| numeric | 数値 |
| digits:5 | ちょうど5桁 |
| digits_between:1,5 | 1〜5桁 |
| gt:10 | 10を超える事 |
| lt:10 | 10未満である事 |
| array | 配列であること |
| in:foo,bar | 指定値のいずれか |
| mimes:jpg,png | 指定拡張子のファイル |
| image | 画像ファイル |
| max:1024 | ファイルサイズ最大1MB |
| unique:users,email | usersテーブルのemailで重複なし |
| exists:users,id | usersテーブルのidが存在する |





ひとつの項目に複数のバリデーション定義をする場合は配列で定義します。