仅当需要字段时,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_1lightboard_line_3 就不再需要了。 由于 minmax 规则,它们目前确实需要一个值。

只有当字段有值并且是必需的时,我才能确保最小值?

字段的 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_2lightboard_line_3 允许为空。当lightboard_line_3 有值时,lightboard_line_1lightboard_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 ( ...

这样,minmax 仅对已完成的字段强制执行。随意根据需要优化代码。

【讨论】:

【参考方案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 验证最小长度的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 无法在表单请求类中制作验证器

Laravel 5.5 / 验证器 / 自定义规则

仅当字段在 asp.net mvc 中可见时才需要字段验证

Laravel 5.5 对具有不同列名的单独表的唯一验证规则

Laravel 中的 required_if 验证

Laravel 5.5 FormRequest 自定义错误消息