【Laravel】Validatorファサードの使い方!違いと特徴やメリットを解説
この記事からわかること
- Laravelのバリデーションとは?
- コントローラで使えるValidatorファサードの使い方
- validateメソッドとValidatorファサードの違い
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelでは入力値を検証するバリデーション機能が複数用意されています。今回はその中でもファサードを使った方法をまとめていきたいと思います。
Laravelで使用可能なバリデーション機能の種類
- validateメソッド:requestオブジェクト
- フォームリクエスト:リクエストインスタンス
- Validatorファサード:ファサード
validateメソッドのポイント
- リクエストを検証するためのメソッド
- バリデーション(値の検証)機能に特化
- 検証エラーで自動リダイレクト
- 導入の前準備は不要
- コントローラ側にバリデーションを記述
FormRequest(フォームリクエスト)のポイント
- フォームから送信されたリクエストを操作、拡張するためのクラス
- バリデーション(値の検証)機能以外も実装可能
- リクエスト作成時にバリデーション処理を挟む
- 検証エラーで自動リダイレクト
- 導入のために専用ファイルをartisanコマンドで生成
- コントローラ側からロジックを切り離せる
Validatorファサード
- バリデーション機能を持ったファサード
- つまりフォーム以外の値も検証可能
- 検証エラー後の操作が自由にカスタマイズ
- 導入のためにファサードを読み込むだけ
- コントローラ側にバリデーションを記述
Validatorファサードの特徴と使い方
Validatorファサードの特徴はフォーム送信された値以外でも検証機能を使用することができるところです。フォーム送信された値の検証はリクエストオブジェクトのvalidateメソッドやフォームリクエストの方が自動リダイレクトされたりと軍配が上がりますがフォーム送信された値以外の値の検証はできません。
どのようなデータであっても連想配列形式で渡された値をルールに則り検証できるのがValidatorファサード最大のメリットであり特徴です。
使用する流れ
- Validatorファサードの読み込み
- バリデータインスタンスの生成(ルールの定義)
- エラー時のリダイレクトとメッセージの格納
use文を使って使用可能にする
Validatorファサードを使えるようにするにはコントローラ内でValidatorファサードを読み込みmake
メソッドを使ってバリデータインスタンスを生成してから使用していきます。
まずは他のファサードと同様にuse
文を使ってValidator
を読み込みます。
use Illuminate\Support\Facades\Validator;
makeメソッドを使ってインスタンス生成
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'title' => 'required',
'body' => 'required',
]);
make
メソッドの第一引数にバリデーションを行いたい値の連想配列、第二引数にバリデーションルールを渡し変数に格納しておきます。フォームを検証したい時は第一引数に$request->all()
を渡せばOKです。
ここではまだ実際の入力値とバリデーションルールを保持したインスタンスを作成しただけです。実際の検証はインスタンスに対してメソッドを実行し結果を取得します。
おすすめ記事:【まとめ】Laravel-バリデーションルール一覧
failsメソッドで検証の結果を取得
バリデーションの結果はpasses
メソッドかfails
メソッドで取得できます。passes
メソッドは成功していたらtrue
を、fails
メソッドは失敗していたらtrue
を返すメソッドです。
if ($validator->fails()) {
// エラー発生時の処理
return redirect('/index')
->withErrors($validator)
->withInput();
}
fails
メソッドでエラーを識別したらredirect
メソッドでバリデーション後のリダイレクト先を、withErrors
メソッドの引数に$validator
を渡すことで$errors
変数にエラーメッセージを自動で格納させることができます。
フォーム送信された値の場合はwithInput
メソッドを使うとフォームの値をそのままリダイレクト先まで引き継がせます。
エラーがなければ後続にその後の処理を記述すればOKです。
Validatorファサードで使えるメソッド
バリデーション済みの入力値の全てを取得
$validated = $validator->validated();
バリデーション済みの入力値の一部を取得
$validated = $validator->safe()->only(['email']);
$validated = $validator->safe()->except(['name', 'email']);
1つでもエラーが発生した時点で後続の検証をSTOP
if ($validator->stopOnFirstFailure()->fails()) {
// エラー発生時の処理
}
エラーメッセージのカスタマイズ
Validatorファサードでエラーメッセージをカスタマイズするにはインスタンス時の第三引数に連想配列形式のメッセージを渡すだけです。
$validator = Validator::make($input, $rules, $messages = [
'required' => '必須項目です',
]);
ルール自体のエラーメッセージではなく指定項目のみのエラーメッセージを変更したい場合は項目名.ルール
をキー値とすれば変更できます。
$messages = [
'email.required' => 'メールアドレスは必須項目です',
];
実際の使い方
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Validator;
class ContactController extends Controller
{
public function confirm(Request $request)
{
// ルールを定義
$rule = [
'name' => 'required',
'email' => 'required|email',
'title' => 'required|max:32',
'body' => 'required',
];
// インスタンスを作成
$validator = Validator::make($request->all(), $rule );
// 検証
if ($validator->fails()) {
return redirect('/contact')
->withErrors($validator)
->withInput();
}
$inputs = $request->all();
return view('contact.confirm', [
'inputs' => $inputs]);
}
Validatorファサードはさらにたくさんの機能を保持しています。続きはこちらの記事をご覧ください。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。