【Laravel】Validatorファサードの使い方!違いと特徴やメリットを解説

【Laravel】Validatorファサードの使い方!違いと特徴やメリットを解説

この記事からわかること

  • Laravelバリデーションとは?
  • コントローラで使えるValidatorファサード使い方
  • validateメソッドとValidatorファサードの違い

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelでは入力値を検証するバリデーション機能が複数用意されています。今回はその中でもファサードを使った方法をまとめていきたいと思います。

参照記事:公式リファレンス-Validatorファサード-

Laravelで使用可能なバリデーション機能の種類

validateメソッドのポイント

FormRequest(フォームリクエスト)のポイント

Validatorファサード

Validatorファサードの特徴と使い方

Validatorファサードの特徴はフォーム送信された値以外でも検証機能を使用することができるところです。フォーム送信された値の検証はリクエストオブジェクトのvalidateメソッドやフォームリクエストの方が自動リダイレクトされたりと軍配が上がりますがフォーム送信された値以外の値の検証はできません。

どのようなデータであっても連想配列形式で渡された値をルールに則り検証できるのがValidatorファサード最大のメリットであり特徴です。

使用する流れ

  1. Validatorファサードの読み込み
  2. バリデータインスタンスの生成(ルールの定義)
  3. エラー時のリダイレクトとメッセージの格納

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です。

ここではまだ実際の入力値とバリデーションルールを保持したインスタンスを作成しただけです。実際の検証はインスタンスに対してメソッドを実行し結果を取得します。

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ファサードはさらにたくさんの機能を保持しています。続きはこちらの記事をご覧ください。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index