この記事は以下の書籍を参考にして執筆しました。
オリジナルバリデータの作成
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
というファイルを作ってそこに書いていく
<?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クラスを修正する。
age
にnumeric|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引数のクロージャをルールとして追加する。
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;
});
}
validate〇〇という名前のメソッドを用意する.
Validator::extendは手軽だが汎用性がない。
1つのコントローラでしか使わないルールはこれで作り
いくつものコントローラで利用する場合はバリデーションクラスを作るという使い分けが良い。