【问题标题】:Laravel validating that key in array is in an array of given stringsLaravel 验证数组中的键是否在给定字符串的数组中
【发布时间】:2023-01-07 16:39:34
【问题描述】:

我正在构建一个接受“additional_data”数组的 API,但我想对可以传入的字段进行一些控制。

采用以下 JSON:

{
    "name": "Joe Bloggs",
    "additional_data": {
        "type": "example",
        "other_type": "example"
    }
}

我当前的验证尝试:

return [
    'name' => ['required'],
    'additional_data.*' => ['sometimes', Rule::in(['type'])]
];

这总是验证失败,我正在寻找的是验证数组的键,这样我就可以确保传入的键是“白名单”的一部分。

【问题讨论】:

    标签: laravel validation


    【解决方案1】:

    您现在要做的是尝试验证additional_data.typeadditional_data.other_type 的内容。

    您可以通过添加自定义验证器来做到这一点。例如

    Validator::extend('check_additional_data_keys', function($attribute, $value, $parameters, $validator) {
        return is_array($value) && array_diff(array_keys($value), ['type', 'other_type']) === 0);
    });
    

    并在您当前的规则中使用它

    return [
        'name' => ['required'],
        'additional_data' => ['check_additional_data_keys'],
        'additional_data.*' => ['required', 'string'],
    ];
    

    【讨论】:

      【解决方案2】:

      只是 specify your whitelist keys 使用 array 验证规则:

      return [
          'name' => 'required',
          'additional_data' => [
              'sometimes', 
              'array:type',
          ],
      ];
      

      【讨论】:

      • 这潜在地暴露了问题,当返回请求“additional_data”时,它仍然是对象。将寻找处理 API json 请求以转换为数组的最佳方法。
      【解决方案3】:

      1-如果你想对所有数组的键应用相同的验证,你可以使用以下内容:

         return [
              'name' => 'required',
              'additional_data' => ['array', Rule::in(['type'])]
              ];
      

      2-如果数组中的每个键需要不同的验证,请使用以下内容:

         return [
              'name' => 'required',
              'additional_data' => 'array',
              'additional_data.ky1' => ['your validation here'],
              'additional_data.ky2' => ['your validation here'],
              ];
      

      【讨论】:

        猜你喜欢
        • 2015-04-30
        • 2010-12-02
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        • 2021-03-01
        相关资源
        最近更新 更多