我正在尝试创建一个至少需要三个输入之一的验证器。
我尝试过此
protected function validateFundingSource (): array
{
return request()->validate([
'title' => 'required',
'description' => 'required',
'national' => 'nullable',
'province' => Rule::requiredIf(!request('national')),
'url' => [
'required_without_all:phone,email',
'active_url'
],
'phone' => [
'required_without_all:url,email|regex:/^(\+\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}(?: *#(\d+))?\s*$/im'
],
'email' => [
'required_without_all:url,phone|email:rfc,dns'
],
'categories' => 'exists:categories,id'
]);
}
但是它只强制第一个字段(url)。所以我尝试了Complex Conditional Validation。
protected function validateFundingSource ()
{
$v = Validator::make(request()->all(), [
'title' => 'required',
'description' => 'required',
'national' => 'nullable',
'categories' => 'exists:categories,id',
]);
$v->sometimes('province', 'required', function ($input) {
return ($input->national === null) ;
});
$v->sometimes('url', 'required|active_url', function ($input) {
return (($input->phone === null) && ($input->email === null));
});
$v->sometimes('phone', 'required|regex:/^(\+\s?)?1?\-?\.?\s?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}(?: *#(\d+))?\s*$/im', function ($input) {
return (($input->url === null) && ($input->email === null));
});
$v->sometimes('email', 'required|email:rfc,dns', function ($input) {
return (($input->url === null) && ($input->phone === null));
});
return $v;
}
但是仍然没有运气...现在不需要我可以提交所有三个空白字段,并且可以正常工作...
有任何帮助我的线索吗?
谢谢!
required_without_all
不是很好的电话号码,但可以通过您的验证。我建议清理您的值以除去数字和前导+之外的所有内容,然后在剩下的地方使用更好的模式。而且,这只是外观上的更改,但您可以像其他规则一样用简单的+ -. (000-111.9999 #8
规则替换Rule::requiredIf(!request('national')),
。
required_if
,这看起来像:form request validation