LoginSignup
1
1

More than 3 years have passed since last update.

【Laravel】バリデータ オリジナルバリデータの作成から

Last updated at Posted at 2020-07-15

この記事は以下の書籍を参考にして執筆しました。

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

Illuminate\Validation\Validatorクラスを継承したクラスを新しく作成する。

基本形がこれ。

use Illuminate\validation\Validator;

class クラス名 extends Validator
{
    public function validate〇〇($attribute, $balue, $parameters)
    {
        //バリデーションの処理
        return 真偽値;
    }
}

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

例えば、validateAbcという名前で用意すれば'abc'というルールとして扱われる。
またバリデーションの処理をして真偽値を返す。

真偽値 説明
true 問題なし
false バリデーションエラー

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

HelloValidatorを作成する

バリデータクラスは手作業で作成していく。
Http/Validators/HelloValidator.phpというファイルを作ってそこに書いていく

HelloValidator.php
<?php
namespace App\Http\Validator;

use Illuminate\Validation\Validator;

class HelloValidator extends Validator
{
    public function validateHello($attribute, $value, $parameters)
    {
        return $value%2==0;
    }
}

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

ここでreturn $value%2==0;を返して、偶数なら許可としている。

HelloValidatorを組み込む

組み込みにはサービスプロバイダを利用する。

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

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

バリデータは$this->app['validator']に保管されている。
このresolverというメソッドでリゾルブ(バリデーションの処理を行う)の処理を設定できる。
引数は以下のようなクロージャ

function ($translator, $data, $rules, $message) {
            return Validator;
        }

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

ここではバリデータのインスタンスをreturnすることで、このクラスをバリデーションの処理として設定している。

HelloValidatorのルールを使用する

class HelloRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        if ($this->path()=='hello') {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
          'name'=>'required',
          'mail'=>'email',
          'age'=>'numeric|hello',
        ];
    }
    public function messages()
    {
        return [
        'name.required'=>'名前は必須項目',
        'mail.email'=>'メアドは必要',
        'age.numeric'=>'整数で記入',
        'age.hello'=>'Hello 入力は偶数のみ受付',
      ];
    }
}

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

HelloRequestクラスを修正する。
agenumeric|helloという形で検証ルールを設定
エラーメッセージはage.helloを指定して設定。
次はコントローラの修正

class HelloController extends Controller
{
    public function index(Request $request)
    {
return view('hello.index',['msg'=>'フォームを入力']);
    }
    public function post(Request $request)
    {
      return view('hello.index',['msg'=>'正しく入力された']);
    }
}

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

これで/helloにアクセスする

Validator::extendを利用する

独自のバリデータクラスの作成をしないほどのカスタマイズしたい場合にはValidatorクラスのextendメソッドを使う

Validator::extends(名前,クロージャ);

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

これで第1引数に指定した名前で第2引数のクロージャをルールとして追加する。

第2引数のクロージャ
function($arrtivute,$value,$parameters,$validator){
  //バリデーションの処理
  return 真偽値;
} 

出典:PHPフレームワークLaravel入門 第2版
validate〇〇という名前のメソッドを用意する.

$arrtivute,$value,$parametersの引数に加えてバリデータのインスタンスを渡す。

これを使って先の独自バリデータクラスを同じことをしてみる。
HelloServiceProvierクラスを修正する。

public function boot()
    {
        Validator::extend('hello', function ($arrtivute, $value, $parameters, $validator) {
            return $value%2==0;
        });
    }

出典:PHPフレームワークLaravel入門 第2版

validate〇〇という名前のメソッドを用意する.

Validator::extendは手軽だが汎用性がない。
1つのコントローラでしか使わないルールはこれで作り
いくつものコントローラで利用する場合はバリデーションクラスを作るという使い分けが良い。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1