仅当需要字段时,Laravel 5.5 验证最小长度
Posted
技术标签:
【中文标题】仅当需要字段时,Laravel 5.5 验证最小长度【英文标题】:Laravel 5.5 validation minimum length only when field is required 【发布时间】:2018-05-29 11:49:58 【问题描述】:我有以下验证规则:
'lightboard_line_1' => 'required_without_all:lightboard_line_2,lightboard_line_3|min:1|max:10',
'lightboard_line_2' => 'required_without_all:lightboard_line_1,lightboard_line_3|min:1|max:10',
'lightboard_line_3' => 'required_without_all:lightboard_line_1,lightboard_line_2|min:1|max:10',
所以想法是当lightboard_line_2
有一个值时,lightboard_line_1
和lightboard_line_3
就不再需要了。
由于 min
和 max
规则,它们目前确实需要一个值。
只有当字段有值并且是必需的时,我才能确保最小值?
字段的 html 代码:
<input name="lightboard_line_1" type="text">
<input name="lightboard_line_2" type="text">
<input name="lightboard_line_3" type="text">
【问题讨论】:
那么你使用了错误的验证规则...你应该使用 required_if:***.com/questions/37777265/… @lewis4u 你能解释一下为什么吗?应该至少有一个具有值的字段。所以如果lightboard_line_1
有值,lightboard_line_2
和lightboard_line_3
允许为空。当lightboard_line_3
有值时,lightboard_line_1
和lightboard_line_2
允许为空。据我了解required_if
,当一个字段有值时,这将要求所有字段都有值?
先告诉我你的字段是什么类型的输入法?文本、选择框还是其他?
@lewis4u 我已经用 HTML 代码更新了我的问题。都是文字。
定义“确保最小值”你到底是什么意思?您现在的规则是确保该值必须在 1 到 10 之间。您想要什么?
【参考方案1】:
我会将验证规则更新为:
$rules = [
'lightboard_line_1' => 'required_without_all:lightboard_line_2,lightboard_line_3',
'lightboard_line_2' => 'required_without_all:lightboard_line_1,lightboard_line_3',
'lightboard_line_3' => 'required_without_all:lightboard_line_1,lightboard_line_2',
];
然后,在根据规则检查规则之前,我会根据输入完成动态修改规则,例如:
if ( $request->has('lightboard_line_1') )
// append to the rule
$rules['lightboard_line_1'] .= '|min:1|max:10';
else if ( ...
这样,min
和 max
仅对已完成的字段强制执行。随意根据需要优化代码。
【讨论】:
【参考方案2】:我找到了解决方案,我现在正在使用此代码进行验证:
/** @var Validator $validator */
$validator = \Validator::make( $request->request->all(), [
'lightboard_line_1' => 'required_without_all:lightboard_line_2,lightboard_line_3',
'lightboard_line_2' => 'required_without_all:lightboard_line_1,lightboard_line_3',
'lightboard_line_3' => 'required_without_all:lightboard_line_1,lightboard_line_2'
], [
'required_without_all' => __( 'At least line is required' ),
'min' => __( 'Your input should be at least :min characters' ),
'max' => __( 'Your input cannot be more than :max characters' )
] );
$validator->sometimes(
'lightboard_line_1',
'required|min:5|max:10',
function ( $input )
return ! empty( $input->lightboard_line_1 );
);
$validator->sometimes(
'lightboard_line_2',
'required|min:5|max:10',
function ( $input )
return ! empty( $input->lightboard_line_2 );
);
$validator->sometimes(
'lightboard_line_3',
'required|min:5|max:10',
function ( $input )
return ! empty( $input->lightboard_line_3 );
);
【讨论】:
哇...多么复杂的优雅解决方案。以上是关于仅当需要字段时,Laravel 5.5 验证最小长度的主要内容,如果未能解决你的问题,请参考以下文章