我正在尝试将以下数据发布到在Laravel上构建的端点。
{
"category": "2",
"title": "my text goes here",
"difficulty": 1,
"correct": {
"id": "NULL",
"text": "Correct"
},
"wrong": [
{
"id": "NULL",
"text": ""
},
{
"id": "NULL",
"text": ""
},
{
"id": "NULL",
"text": ""
}
]
}
我有以下验证规则。
return [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|array|between:1,3'
];
我想要完成的是wrong
应该是和数组,它应该包含至少一个元素,不应超过3.现在这些规则令人满意,但还有一个案例我需要采取护理,这是text
中wrong
的验证。根据当前规则,如果我发布上述数据,则会接受,因为text
部分中的wrong
没有适用的规则。我需要添加哪条规则来验证wrong
部分是否至少包含一个非空文本的条目。
答案 0 :(得分:1)
如果您对验证者规则有非常具体的需求,您可以随时create your own。
该计划将是:properties_filled:propertyName:minimumOccurence
。此规则将检查验证字段是否为
minimumOccurence
的元素属性中至少有!== ''
个非空(propertyName
)值。在app/Providers/AppServiceProvider.php
文件的boot
方法中,您可以添加自定义规则实施:
public function boot()
{
Validator::extend('properties_filled', function ($attribute, $value, $parameters, $validator) {
$validatedProperty = $parameters[0];
$minimumOccurrence = $parameters[1];
if (is_array($value)) {
$validElementCount = 0;
$valueCount = count($value);
for ($i = 0; $i < $valueCount; ++$i) {
if ($value[$i][$validatedProperty] !== '') {
++$validElementCount;
}
}
} else {
return false;
}
return $validElementCount >= $minimumOccurrence;
});
}
然后您可以在验证中使用它:
return [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|between:1,3|properties_filled:text,1'
];
注意:我认为您将json_decode
的$assoc
参数设置为true
来解析您的JSON数据。如果您使用对象,请将条件中的$value[$i][$validatedProperty] !== ''
更改为:$value[$i]->{$validatedProperty} !== ''
。
以下是我的示例测试:
$data = json_decode('{"category":"2","title":"mytextgoeshere","difficulty":1,"correct":{"id":"NULL","text":"Correct"},"wrong":[{"id":"NULL","text":""},{"id":"NULL","text":""},{"id":"NULL","text":""}]}', true);
$validator = Validator::make($data, [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|between:1,3|properties_filled:text,1'
]);
$validator->fails();
答案 1 :(得分:0)
编辑:我认为错误将具有特定值,因此以这种方式传递该值
return [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|array|between:1,3',
'wrong.text' => 'sometimes|min:1|in:somevalue,someothervalue',
];
sometimes
验证确保仅在存在时检查该字段。要检查是否至少会有
我不确定,min
是否足以满足您的要求?否则,您必须像其他人建议的那样编写自定义验证规则
答案 2 :(得分:0)
在尝试在API端验证数组时遇到了相同的问题。我提出了解决方案。试试这个
$validator = Validator::make($request->all(), [
'target_user_ids' => 'required',
'target_user_ids.*' => 'present|exists:users,uuid|distinct',
]);
if ($validator->fails()) {
return response()->json([
'status' => false,
'error' => $validator->errors()->first(),
], 400);
}
答案 3 :(得分:-1)
如果要验证数组中的输入字段,可以按如下方式定义规则:
return [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|array|between:1,3',
'wrong.*.text' => 'required|string|min:1',
];