条件に応じてルールが変更できるようにする
例えばフォームに連絡先を入力できるとして
それが「メールアドレス」または「電話番号」どちらかえらんで入力できるようにしたい時
それぞれのエラーの条件が変わってくる。
その時には「sometimes」というメソッドが使えるらしい。
$validator->sometimes(項目名、ルール名、クロージャ)
ここでクロージャってなんなん?
ってなる。
ルールをついかするべきかどうか判断するものらしい
function($input){ 処理を実行 return 真偽値; }
input には入力された値をまとめたものがくる。
戻り値は真偽値になり true なら何も処理がない
falseなら sometimes で指定したルールが適用される。
public function post(Request $request)
{
$rules = [
'name' => 'required',
'mail' => 'email',
'age' => 'numeric',
];
$message = [
'name.required' => '名前が入力されていません',
'mail.email' => 'メールアドレスが必要です',
'age.numeric' => '年齢は整数で入力してください',
'age.min' => '年齢は0歳以上で入力してください',
'age.max' => '年齢は150歳以下で入力してください',
];
$validator = Validator::make($request->all(), $rules, $messages);
$validator->sometimes('age', 'min:0', function($input){
return !is_int($input->age);
});
$validator->sometimes('age', 'max:150', function(input){
return !is_int($input->age);
});
if ($validator->fails()){
return redirect('/hello')
->withErrors($validator)
->withInput();
}
return view('hello.index',['msg'=>'正しく入力されました']);
}
自分でバリデータのルールが作れる!
use Illuminate\Validation\Validator;
class クラス名 extends Validator
{
public function validate 〇〇($attribute, $value, $parameters)
{
バリデーションの処理
return 真偽値;
}
}
〇〇に入れた言葉がそのバリデーションのルールとして認識される。
「ValidateAbc」という名前にしたら'abc'というルールになる
第1引数 属性(設定したコントロール名など)
第2引数 チェックする値
第3引数 ルールに渡されるパラメータ
実際に使ってみる
コマンドとかで作ったりできないので
手作業。
Http/Validators/〇〇Validator.php
フォルダ(Validators)とファイル(Validator.php)を作成する
<?php
namespace App\Http\Validators;
use Illuminate\Validation\Validator;
class 〇〇Validator extends Validator
{
public function validate〇〇($attribute, $value, $parameters)
{
return $value % 2 == 0;
}
}
〇〇Validatorというクラス名を作成
この中にvalidate〇〇というメソッドが用意してある。
‘〇〇’というルールがこれで作成される。
'$value % 2 == 0'すなわち入力されてきた値が偶数なら許可
奇数なら不可となる!
そしてこの作成した〇〇Validatorを組み込んでみる。
サービスプロバイダ必要なので
作る。
サービスプロバイダについてはまた書くことにします。
コマンドで作成せねば。
(参考書に従って進んでいてそこの部分を飛ばして進んでた汗)
〇〇サービスプロバイダがあるとして、、、、、、
providers/〇〇ServiceProvider.phpを開いて
その中の「bootメソッド」を書き換え
// use Validator;
// use App\Http\Validators\HelloValidator;
public function boot()
{
$validator = $this->app['validator'];
$validator->resolver(function($translator, $data, $rules, $messages) {
return new 〇〇Validator($translator, $data, $rules, $messages);
});
}
バリデータが $this->app['validator']に保管されている
resolverというメソッドは リゾルブというバリデーションの処理を行う。
Validatorのインスタンスをリターンしてこのクラスのバリデーション処理を行う
これでルールが完成されたので
実際に設置してみる
class 〇〇Request extends FormRequest
{
public function authorize()
{
if ($this->path() == '〇〇')
{
return true;
} else {
return false;
}
}
public function rules()
{
return [
'name' => 'required',
'mail' => 'email',
'age' => 'numeric|〇〇',
];
}
public function messages()
{
return [
'name.required' => '名前は必ず入力して下さい。',
'mail.email' => 'メールアドレスが必要です。',
'age.numeric' => '年齢を整数で記入下さい。',
'age.〇〇' => '入力は偶数のみ受け付けます。',
];
}
}
ageに「numeric|〇〇」という形でさっき作ったルールが入っている。
エラーメッセージは age.〇〇 「入力は偶数のみ受け付けます。」が設定されている。
コントローラーを修正
class 〇〇Controller extends Controller
{
public function index(Request $request)
{
return view('hello.index', ['msg'=>'フォームを入力してください']);
}
public function post(〇〇Request $request)
{
return view('hello.index', ['msg'=>'正しく入力されました!']);
}
}
これで数値が奇数ならエラー文が吐き出される。