【问题标题】:Laravel: how to validate that required subarray items are present?Laravel:如何验证所需的子数组项是否存在?
【发布时间】:2019-05-16 20:44:51
【问题描述】:

在我的 laravel POST 端点中,我期待以下形式的“items”参数:

$items => [
  ['item' => 'a', 'item_slot' => 1],
  ['item' => 'b', 'item_slot' => 2],
  ['item' => 'c', 'item_slot' => 3],
]

我想验证是否提供了所有必需的物品栏。

我有一组所需的插槽$requiredItemSlots = [1, 2]

我应该使用什么验证规则来确保$requiredItemSlots 中的项目插槽存在?请注意,我不想将提供的插槽限制为所需的插槽,我只需要确保所需的插槽已填满。

现在我有类似的东西:

'items.*.item' => 'required',
'items.*.item_slot' => 'required|distinct'

确保没有重复的槽被传入。

最初我尝试做

'items.*.item_slot' => Rule::in($requiredItemSlots)

但这是不正确的,因为并非所有插槽都是必需的。

【问题讨论】:

    标签: php laravel laravel-5.7


    【解决方案1】:

    您可以使用distinctin:1,2,3size:3 的组合来验证输入:

    'items' => 'required|array|size:3',
    'items.*.item_slot' => [
        'required',
        'distinct',
        Rule::in($requiredSlots),
    ]
    

    使用size:3,您可以强制数组恰好具有3 元素。使用distinct,您可以确保item_slot 元素字段中没有重复项。使用Rule::in($requiredSlots),您可以确保没有未知的item_slots

    【讨论】:

      【解决方案2】:

      你需要创建一个custom rule,类似这样:

      'items' => [
          'required', 
          'array', 
          function ($attribute, $value, $fail) {
              $required = [1, 2];
              // Cast to collection for easier checks
              $items = collect($value);
              foreach ($required as $r) {
                  if (! $items->firstWhere('item_slot', '=', $r)) {
                      $fail("$r has to be present in items.");
                  }
              }
          },
      ], // ..other validation rules
      

      【讨论】:

      • function ($attribute, $value, $fail) use ($requiredSlots) {... 将允许您从闭包中访问您的 $requiredSlots,而无需在其中定义它,如果有用的话。
      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 2016-06-11
      • 2019-02-23
      • 2019-03-11
      • 1970-01-01
      • 2017-10-13
      • 2021-01-04
      • 2021-12-10
      相关资源
      最近更新 更多