bigmac-jp blog

web開発関連のメモ

Laravel5.4 フォームリクエスト 条件バリデーション

バリデーションチェックをフォームリクエストで実装する場合に、画面入力条件によってチェック内容を動的に実装をしたく調査した。

例:
入力画面側で年齢(age)が18才未満を入力した場合、親同意チェックボックス(parent_confirm)がチェックされていることをチェックする。
年齢(age)が18以上の場合は、親同意チェックボックス(parent_confirm)のチェク処理は実行しない。

■コントローラー側で条件付きバリデーションを実装す
下記のsometimesルールを使う。

  public function create(Request $request){

    $validator = Validator::make($request->all(), [
      'age' => 'required',
    ]);

    // 条件チェック(年齢が18才未満の場合)
    $validator->sometimes('parent_confirm', 'required', function($input){
      return $input->age <= 17;
    });

    if($validator->fails()){
        return redirect('/xxx/hoge')
                ->withErrors($validator)
                ->withInput();
    }
    return redirect('/top);
  }


■フォームリクエストで条件付きバリデーションを実装。
withValidatorでフォームリクエストへフックを追加。

class HelloRequest extends FormRequest
{

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'age' => 'required',
        ];
    }
    
    public function withValidator($validator)
    {
        $validator->sometimes('parent_confirm', 'required', function($input){
            return $input->age <= 17;
          });
    }
}