Laravel独自のバリデーションをつくる方法【個人的なお勉強アウトプット】


参考図書

オリジナルのバリデータの作成にはいくつか方法がある。

  • Illuminate\Validation\Validatorクラスを継承したクラスを作成する方法(現在は非推奨のようです)
  • Validator::extendを使う方法
  • 独自のバリデーションルールをつくる

Illuminate\Validation\Validatorクラスを継承したクラスを作成する方法(現在は非推奨のようです)

use Illuminate\Validation\Validator;

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

Validatorクラスを継承して作成。その中に「validate***」という名前のメソッドを用意。これがバリデーションで使われるルールとして認識される。
例えば「validateAbc」という名前でメソッドを用意すれば'abc'としてつくぁれる。

実例

バリデータクラスの作成

バリデータクラスはコードを生成するコマンドは用意されていない。作業でスクリプトファイルを用意する。

app/Http/Validators/HelloValidator.php
namespace App\Http\Validators;

use Illuminate\Validation\Validator;

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

HelloValidatorという名前で暮らすを作成。
偶数なら許可、奇数なら非許可となるバリデーションルール。

サービスプロバイダに組み込む

app/Providers/HelloServiceProvider.php
use Validator;
use App\Validators\HelloValidator;

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

バリデータは$this->app['validator']に保管されている。resolvverというメソッドでバリデーションの処理を粉う設定ができる。
クロージャでHelloValidatorクラスのインスタンスをreturnすることで設定できる。

HelloValidatorルールを利用

フォームリクエストのバリデーションルールを設定する箇所にHelloValidatorルールを設定する。
(多分からなずしもフォームリクエストじゃなくても大丈夫。)

app/Http/Requests/HelloRequest.php
public function rules(){
return [
'age' => 'numeric|hello'
]
}

コントローラでフォームリクエストを利用の設定

app/Http/Controllers/HelloController.php
public function post(HelloRequest $request){
return view('hello.index', ['msg'=>'正しく入力されました']);
}

Validator::extendを使う方法

上記のように独自のバリデータクラスを定義シて組み込むのはきちんとしたバリデータ処理を作成して汎用的に使えるようにする場合は有効。しかし、このフォームだけちょっとカスタマイズしたいルールを使いたい、という場合にextendを使うと簡単。

app/Providers/HelloServiceProvider.php
public function boot(){
Validator::extend('hello', function($attribute, $value, $parameters, $validator){
return $value % 2 == 0;
});
}

これで'hello'というルール名が追加される。
あとはフォームリクエストでルールを設定すればいいだけ。

独自のバリデーションルールをつくる

バリデータ自体の独自のルールをつくる方法
バリデーションルールはIlluminate\Contacts\Validation名前空間の「Rule」というクラスを継承して作られている。
この「Rule」を継承したクラスを用意すれば、そのクラスをバリデーションのルールとして使えるようになる。

バリデーションルールファイルの作り方

php artisan make:rule Myrule
appフォルダの中にRulesというフォルダが作成され、そのなかにMyrule.phpが作成される。

app/Rules/Myrule.php
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class Myrule implements Rule
{

    public function __construct($n)
    {
        $this->num = $n;
    }

    public function passes($attribute, $value)
    {
        return $value % $this->num == 0;
    }

    public function message()
    {
        return $this->num . 'で割り切れる値が必要です。';
    }
}


指定した数値で割り切れるかどうか判定するバリデーション

Myruyleを使う

フォームリクエストのrulesメソッドに設定。

app/Http/Requests/HelloRequest.php
public function rules(){
return [
'age' => 'numeric|new Myrule(5)',
];
}

5で割り切れるかどうか判定できるようになる。