表单验证有时候你可能需要增加基于更复杂的条件逻辑的验证规则。例如,你可以希望某个指定字段在另一个字段的值为1的时候才为必填或校验其他规则。或者当某个指定字段存在时,另外两个字段才能具有给定的值。
那么这个时候验证后钩子就起作用了
创建表单验证
namespace App\Http\Requests;
use App\Rules\IntValueBetween;
use App\Rules\Mobile;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class ApiWarn extends BaseFormRequest
{
public $errorCode = 2200;
protected $mobile = '';
/**
* Get the validation rules that apply to the request.
*
* @param Request $request
* @return array
*/
public function rules(Request $request)
{
return [
'status' => ['bail', 'required', 'integer', 'in:0,1'],
'mobile' => [],
];
}
/**
* 固定校验类型错误信息
*
* @return array
*/
public function messages()
{
return [
'mobile.required' => '手机号不能为空',
'status.required' => '状态不能为空',
];
}
/**
* 表单校验后的钩子使用
*
* @param $validator
*/
public function withValidator($validator)
{
$validator->sometimes('mobile', ['required'], function ($input) {
return $input->status == 1;
});
parent::withValidator($validator);
}
}
这个表单验证类主要用途:
1、校验status是必填、位数字、在【0,1】内
2、mobile规则为空:因为只有在status为1的时候才去校验手机号,而且必须要有这个规则(如果没有,那么当status为0的时候,校验结果validated里面也不会有这个参数)
3、当status校验通过够,由于手机号没有规则,所以即将返回校验结果:但是返回前会检查该表单是否存现钩子(withValidator)
4、所以如果定义了钩子那么接下来就是钩子表演时间了:我们可以在钩子里面进行mobile的选择性校验
5、神奇的sometimes:根据status状态选择是否需要校验手机号
$validator->sometimes('mobile', ['required'], function ($input) {
return $input->status == 1;
});