(Laravel) バリデーション【コントローラ以外に記述する方法4選】

laravel-validation-outof-controller

 

Laravelのバリデーションに関するメモ書き。
特に、バリデーションをコントローラ以外に書いていく方法について

コントローラに記述する方法については、下記記事で紹介しているので、参考に。

 

最初に結論を言うと、下記の4つの方法を本記事では紹介する。

バリデーションをコントローラ以外に書いていく方法
  1. フォームリクエストを使用してバリデーション
  2. バリデータを作成してバリデーション
  3. オリジナルバリデータの作成
  4. Validator::extend を使用してバリデーション

 

順に紹介していく。

 

①フォームリクエストを使用してバリデーション

コントローラからバリデーションを切り離す代表的な機能として、
「フォームリクエスト」というものがある。

laravel-formrequest-image

フォームリクエストは、リクエストをフォーム利用のために拡張したもの。
クライアントからのリクエストをインスタンスとして扱うための、Requestクラスを継承して作成されており、バリデーション機能が組み込まれている

これにより、コントローラからバリデーションを切り離して、バリデーションを実行することが可能。

 

フォームリクエストの作成

フォームリクエストの作成は下記。

php artisan make:request  ◯◯Request

◯◯は任意

 

フォームリクエストが作成される場所

フォームリクエストは下記に作成される。

app→Http→Request

 

フォームリクエストの使い方

使い方を説明する前に、フォームリクエストの初期状態を確認しておいてもらいたい。

HelloRequestという名前で作成した場合の例、下記のような初期状態になる。
authorizeメソッドと、rulesメソッドの二つが用意されている。

namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;

class HelloRequest extends FormRequest
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */

    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }

}

 

上記を踏まえ、フォームリクエストの使い方を簡単に説明すると、下記のような手順になる。

フォームリクエストの使い方
  1. フォームリクエストを使用したいアクションの引数$requestのクラスを修正する
  2. authorizeメソッドが呼び出され、フォームリクエストの使用許可、または不許可の結果が返される
  3. ②の結果が許可なら、rulesメソッドが呼ばれ、バリデーションが実行される

 

順に手順を説明していく。

 

①フォームリクエストを使用したいアクションの引数$requestのクラスを修正する

作成したフォームリクエストを呼び出すために、まず初めに、
作成したフォームリクエストを使用したいアクションの引数を修正する。

以下は「HelloRequest」というフォームリクエストを使用する場合の例。

public function post(HelloRequest $request) //HelloRequestの$requestになっている
{
    return view('hello.index, ['msg'=>'OK!']);
}

 

引数を、HelloRequestクラスの$requestに修正する。
これで、アクションが呼ばれる時、アクション実行の前に、クライアントからのリクエスト内容をフォームリクエストでバリデーションすることが可能となる。

 

②authorizeメソッドが呼び出され、フォームリクエストの使用許可、または不許可の結果が返される

①によってフォームリクエストが呼び出されると、初めにauthorizeメソッドが呼び出される。

authorizeメソッドは、フォームリクエストの使用許可、不許可を返すメソッド。
trueを返せば許可、falseを返せば不許可となる。

  • return true → 許可
  • return false → 不許可

 

# authorizeメソッドの編集例
class HelloRequest extends FormRequest
{
    public function authorize()
    {

        if ($this->path() == 'hello')
        {

             return true; //許可

         } else {

            return false; //不許可

        }

    }

FormRequestは、クライアントからのリクエスト情報をインスタンスとして扱うRequestクラスを継承しているため、「$this」からリクエストの情報を取得することが可能。

取得したリクエストの内容を元に、バリデーション実行対象として許可・不許可を判断する。

 

③ ②の結果が許可なら、rulesメソッドが呼ばれ、バリデーションが実行される

②authorizeメソッドの結果が許可(true)であれば、次にrulesメソッドが呼び出される。
rulesメソッドは、適用されるバリデーションの検証ルールを返すメソッド

public function rules()
{

    return [
        'name' => 'requied',
        'mail' => 'email',
        'age' => 'numeric|between:0,150',
    ];

}

 

上記では項目、「name」「mail」「age」について、バリデーションが適用されるルールが設定されている。

 

フォームリクエストまとめ

laravel-formrequest-stream

ちょっと長くなったので、フォームリクエストを使ったバリデーションについて簡単に流れをまとめた。

フォームリクエストバリデーションまとめ
  1. コマンドでフォームリクエストを作成
  2. アクションの引数(リクエストインスタンス)を呼び出すフォームリクエストのクラスに修正
  3. アクションを呼び出す再に、フォームリクエストが呼び出される

 

②バリデータを作成してバリデーション

次に、バリデータを作成してバリデーションする方法を紹介する。

 

バリデータとは

コントローラのvalidateメソッドを使わずに、
Validatorクラスのインスタンスを作成してバリデーション処理する機能。

これにより、バリデーションエラー時に、フォーム元にリダイレクトせず、
別の処理を実行するといった、カスタマイズ処理の実行が可能になる。

 

バリデータの利用

Validatorクラスのインスタンスを作成するには、
アクション内に次のルールで作成する。

$validator = Validator::make( 値の配列, ルールの配列 );

 

ここにタイトル
  • (第一引数)値の配列→チェックする値の配列。フォームで送られてくる値。
  • (第二引数)ルールの配列→バリデーションのルール

 

実行結果によって作成されたインスタンス($validator)には、
バリデーションの結果が格納されているので、それを元に、
後続でカスタマイズ処理を記述していく。

 

クエリ文字列のバリデーション

Validatorインスタンス作成の際、
第一引数を下記のように変更することで、クエリ文字列をバリデーションすることができる。

$validator = Validator::make($request->query(),[ //引数に注目
     //バリデーションルールを記載
}

 

引数を、$request->query()とすることで、
フォームではなく、クエリ文字列でパラメータが渡ってきた場合にバリデーション可能。
バリデーションルールの書き方は「キー=>ルール」で変わらない

 

必要に応じてルールを追加する「sometimes」

Validatorクラスの、「sometimes」メソッドを使うことで、
項目ごとにルールを細かく追加することができる。

$validator->sometimes( 項目名, ルール名, クロージャ);

 

クロージャの結果がfalseだった場合に、
指定した項目名に、指定したバリデーションルールが追加される。
trueの場合は何もしない。

以下例
!is_int($input->age)の結果が、falseだった場合に、
ageに対して、min:0のルールでバリデーションがかけられる

$validator->sometimes( 'age', 'min:0', function($input) {
    rerurn !is_int($input->age);
});

 

ちょっと難しいので、詳しい使い方に関しては下記

 

③オリジナルバリデータの作成

次にオリジナルバリデータを作成してバリデーションする方法を紹介する。

 

オリジナルバリデータとは

独自のバリデーションルールのこと。

もともとあるバリデーション以外のルールで、
バリデーションを行いたいときに使う。

 

オリジナルバリデータの使いかた

オリジナルバリデータを使うには、バリデータそのものを作ってしまう。Illuminate\Validation\Validatorクラスを継承したクラスを作成する。
作成する場所にとくに決まりはないのでHttp以下にでも作る。

use Illuminate\Validation\Validator;

class クラス名 extends Validator
{

     public function validate〇〇($attribute, $value, $parameters)
        {

            //バリデーション処理

            return 真偽値;
        }
}

 

〇〇の部分は、バリデーションのルール名になるので注意。
validateHello → ‘hello’というルール名で認識される

 

オリジナルバリデータ
  • 引数1、、属性
  • 引数2、、チェックする値
  • 引数3、、ルールに渡されるパラメータ

 

オリジナルバリデータを組み込む

オリジナルバリデータを組み込むには、サービスプロバイダを使用する。
その中の、とくにbootメソッドを修正していく

オリジナルバリデータを、
「app→Http→Validators(自分で作成)→HelloValidator.php」として作成した場合、
下記のようにHelloServiceProvider.phpを修正

// use Validator;
// use App\Http\Validators\HelloValidator;

public function boot() {

    $validator = $this->app['validator];
    $validator->resolver(function($translator, $data, $rules, $message) {
        return new HelloValidator($translator, $data, $rules, $message);
    });
}

 

正直この書き方の詳細はよくわからなかったので、
とりあえず「オリジナルバリデータは、サービスプロバイダのbootで呼び出すんだな」
という理解まで、、

また調べたら、リライトしたいと思う。

 

④Validator::extend を使用してバリデーション

バリデーションクラスを作るほどしっかりしたバリデーションではなかったり、
特定のアクション内でだけ実行したい汎用性ゼロのバリデーションの場合には、
Validator::extendを使ってバリデーションをする。

同じくbootメソッド内で組み込む

 

//書式
Validator::extend( 名前, クロージャ );

 

第二引数のクロージャの書き方

function($attribute, $value, $parameters, $validator)
{

 //バリデーション処理
    return 真偽値;

}

 

バリデーションクラスのvalidate〇〇メソッドと似ているが、4つ目の引数にバリデータインスタンスを渡す。

 

上記ができたらbootメソッドに組み込む

public function boot()
{

    Validator::extends('hello', function($attribute, $value, $parameters, $validator) {

        return $value % 2 == 0;

    });

}

 

これで「hello」というルール名が追加された。
ちょっとした簡単なバリデーションは上記のようにすると楽。

 


 

コントローラに記述する方法については、下記記事で紹介しているので、参考に。

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。