Laravel验证数组中的键是否在给定字符串的数组中

uujelgoq  于 2023-01-10  发布在  其他
关注(0)|答案(3)|浏览(223)

我正在构建一个接受'additional_data'数组的API,但我希望对可以传入的字段进行一些控制。
以下面的JSON为例:

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

我当前的验证尝试:

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

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

tvz2xvvm

tvz2xvvm1#

您现在要做的是尝试验证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'],
];
nkoocmlb

nkoocmlb2#

只需使用array验证规则指定白名单密钥:

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

j8ag8udp3#

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'],
        ];

相关问题