【问题标题】:Validate array of inputs in form in Laravel 5.7在 Laravel 5.7 中以表单形式验证输入数组
【发布时间】:2019-02-23 13:10:34
【问题描述】:

我的表单多次具有相同的输入字段。我的表单域如下:

<input type='text' name='items[]'>
<input type='text' name='items[]'>
<input type='text' name='items[]'>

并且请求包含($request['items'):

array:1 [▼
  "items" => array:3 [▼
    0 => "item one"
    1 => "item two"
    2 => "item three"
  ]
]

我希望至少填写其中一项。我当前在控制器中的验证是

    $validator = Validator::make($request->all(),[
        'items.*' => 'required|array|size:1'
    ]);

它不起作用。我尝试了大小、必需、可为空的组合。没有任何效果。

【问题讨论】:

  • 你想要这个填入你的数据库吗?并检查所有要求对吗?
  • 是的。上面的代码在我的控制器中。
  • 尝试不使用.* 并将大小更改为最小为'items' =&gt; 'required|array|min:1'
  • 我尝试了解决方案,没有成功

标签: php laravel laravel-5 laravel-validation laravel-5.7


【解决方案1】:

其实用就够了:

$validator = Validator::make($request->all(),[
        'items' => 'required|array'
    ]);

所做的更改:

  • 使用items而不是items.* - 你想设置一般项目的规则,如果你使用items.*这意味着你将规则分别应用于数组的每个发送元素
  • 删除了size:1,因为这意味着您只想发送一个元素(并且至少需要一个)。你根本不需要它,因为你有required 规则。您可以阅读documentation for required rule 并且您可以在其中阅读空数组会导致required 规则失败,因此此required 数组规则使该数组应至少有1 个元素,因此您不需要@ 987654330@ 或 size:1 都没有

【讨论】:

    【解决方案2】:

    你可以这样检查:

    $validator = Validator::make($request->all(), [
        "items"    => "required|array|min:1",
        "items.*"  => "required|string|distinct|min:1",
    ]);
    

    在上面的例子中:

    • “items”必须是一个至少包含 1 个元素的数组。
    • “items”数组中的值必须是不同(唯一)的字符串,长度至少为 1 个字符。

    【讨论】:

    • 在这种情况下,即使字段不为空,$validator->fails() 也会返回 true
    • 您输入的是不同的字段值吗?
    • "items" => array:4 [▼ 0 => null 1 => null 2 => "item-three" 3 => null ] 这是我的输入
    【解决方案3】:

    您可以使用带有闭包的自定义规则。

    https://laravel.com/docs/5.7/validation#custom-validation-rules

    要检查一个数组是否包含所有空值,请使用 array_filter 进行检查,如果它们都为空,则返回 false。

    比如……

      $request->validate([
    
        'items' => [
          // $attribute = 'items', $value = items array, $fail = error message as string
           function($attribute, $value, $fail) {
             if (!array_filter($value)) {
               $fail($attribute.' is empty.');
             } 
           },
         ]
       ]);
    

    这将设置错误消息:'items is empty。"

    【讨论】:

      【解决方案4】:

      知道您使用的是最新版本的 Laravel,我真的建议您查看 Form Request feature。这样一来,您就可以将验证与控制器分离,从而使其更加简洁。

      无论如何,正如我上面的答案所建议的那样,你应该足够了:

      'items' => 'required|array'
      

      【讨论】:

        【解决方案5】:

        像往常一样正常做:

         $validator = Validator::make($request->all(),[
            'items' => 'required'
          ]);
        

        【讨论】:

        • 也不行。 $validator->fails() 在该条件下始终返回 false
        • 你的意思是 $validator->fails() 总是返回 false,即使你在 items 中传递了一个项目
        • 它在我的项目中运行良好,你的代码可能有问题,但我的项目中有 laravel 5.6,但你有 5.7 可能是问题或其他问题。
        【解决方案6】:

        你应该试试这个:

        $validator = $request->validate([
            "items"    => "required|array|min:3",
            "items.*"  => "required|string|distinct|min:3",
        ]);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-07
          • 1970-01-01
          • 2017-11-13
          • 2014-09-20
          • 1970-01-01
          • 2017-10-30
          • 2015-02-22
          相关资源
          最近更新 更多