Blog スタッフブログ

Laravel システム開発

[Laravel]Laravelでの条件付きバリデーション2

システム開発担当のTFです。

前回より、複雑な条件のバリデーション処理の仕方です。

前回

[Laravel]Laravelでの条件付きバリデーション

※Laravel8系統対応

やり方

  • bladeでフォーム作成
  • FormRequestを作成し、withValidatorを設定する
  • Controllerで、作成したFormRequestを使用する

参考

  Laravel の FormRequest で sometimes を使いたい時は withValidator メソッド経由が良さ気
  withValidatorを使い、バリデーション後にバリデーションをする

サンプル

<form action="{{ route('request.store')}}" method="POST">
	@csrf
	<div>
		<div>
			<label>数値a</label>
			<input type="number" name="value_a" >
			
		</div>
		<div>
			<label>数値b(数値aの 2分の1以上)</label>
			<input type="number" name="value_b" >
		</div>
	</div>
	
	<button>送信</button>
</form>
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SampleRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
			,'value_a'=>'required|numeric'
			,'value_b'=>'required|numeric'
		];
    }
	
	public function withValidator(\Illuminate\Contracts\Validation\Validator $validator)
    {
        // 数値a
        $value_a = $this->input('value_a');
		
		// 数値b
        $value_b = $this->input('value_b');

		$validator->after(function ($validator) use($value_a, $value_b) {
			// 数値aの 2分の1より小さい
			if($value_b < $value_a / 2) {
				$validator->errors()->add('value_b', '数値aの 2分の1以上の値を入力してください');
			}
		});
    }
	
	public function messages()
	{
		return [
			'required' => '必須入力です',
		];
	}
}
<?php

namespace App\Http\Controllers;

use App\Http\Requests\SampleRequest;

class RequestController extends Controller
{
    public function store(SampleRequest $request)
    {
		// 登録処理
    }
    
}