この記事は以下の書籍を参考にして執筆しました。
バリデーション
- コントローラでバリデーション(簡単)
- フォームリクエストを使う
- バリデータを使う
コントローラでバリデーション
コントローラの基底クラスValidateRequestというトレイトの機能。
基本的にコントローラにあるメソッドと思ってもらって一向に構わない。
$this->validate($request,[検証設定の配列]);
[
'フォームの項目名'=>'検証ルール',
'フォームの項目名'=>'検証ルール',
...
]
フォームリクエストを使う
コントローラではないところでバリデーションをする。
フォームリクエスト
リクエストをフォーム利用のために拡張したもの。
Requestクラスを拡張してFromRequestが作成される。
FromRequestのメソッド
フォームリクエストをartisaで、例えばHelloRequestという名前で作成するとHelloRequestクラスはFromRequestを継承している。
FromRequestはリクエスト機能をベースに、バリデーションなどのフォーム処理機能が追加されている。
FromRequestには以下のメソッドがある
authorize
フォー0無リクエストを利用するアクションでフォームリクエストの利用が許可されているかどうかを示す。戻り値は真偽値。
真偽値 | 説明 |
---|---|
true | 許可 |
false | 不許可。例外が発生してフォーム処理できなくなる |
rules
検証値ルールを設定。
メッセージのカスタマイズ
FromRequestのmessageをオーバーライドする。
public function message(){
return [
'項目名.検証ルール'=>'エラーメッセージ',
'項目名.検証ルール'=>'エラーメッセージ',
...
];
}
バリデータを使う
コントローラでValidatorクラスのインスタンスを作成して処理する。
//use Validator; を追加する
public function post(Request $request){
$validator=Validator::make($request->all(),$rules);
if($validator->fails()){
return redirect('hello')->withError($validator)->withInput();
}
return view('hello.index',['msg'=>'正しい入力']);
}
バリデータの基本
Validatorインスタンスの作成はmakeを使って行う
$validator=Validator::make(値の配列,ルール配列);
引数 | 説明 |
---|---|
第1引数 | チェックする値をまとめた配列 |
第2引数 | 検証ルール |
フォームをそのままチェックするなら$request->all()でOK
エラーチェック
if($validator->fails()){...
fails
返り値 | 説明 |
---|---|
true | バリデーションエラー発生 |
false | 問題なし |
passes
同じ機能としてpassesというメソッドもある
これはfailsのときと逆。
返り値 | 説明 |
---|---|
true | 問題ない |
false | バリデーションエラー発生 |
入力フォームのリダイレクト
このスクリプトはエラーが発生したらフォームページへ戻るようにしている。
redirect('hello')->withError($validator)->withInput();
メソッド | 説明 |
---|---|
redirect | 指定のアドレスへ移動 |
withErrors | Validatorで発生したエラーメッセージをリダイレクト先まで引き継ぐ |
withInput | 送信されたフォームをリダイレクト先まで引き継ぐ |
クエリ文字列のバリデータを適応する
Validatorインスタンス作成の第1引数にクエリ文字列の配列値を渡す。
第2引数には項目を書く。
$validator=Validator::make($request->query(),[
'id'=>'required',
'pass'=>'required'
]);
$request->query()
はこんな感じになる。
// アクセスしたアドレスが「/hello?id=taro&pass=yamada」なら
[
'id'=>'taro',
'pass'=>'yaamda'
]
エラーメッセージのカスタマイズ
Validatorインスタンス作成時、第3引数へ指定する。
$validator=Validator::make(値の配列,ルール配列,エラーメッセージ配列);
メッセージは'項目名.検証ルール'=>'エラーメッセージ'
を配列にしたもの。
まぁいつもの。
条件に応じてルールを追加
$validator->sometimes(項目名、ルール名、クロージャ)
sometimesを処理した結果によってルールを追加する。
クロージャがルールを追加すべきかを決定する。
function ($input){
//処理
return 値;
}
項目 | 説明 |
---|---|
$input | 入力された値をまとめたもの |
値 | ルールを追加すべきかを決める。trueなら何もしない。falseならルール追加。 |
$input->name
という具合で取り出せる。