Laravel验证数组中至少需要一个元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel验证数组中至少需要一个元素相关的知识,希望对你有一定的参考价值。
我试图将以下数据发布到在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
部分至少包含一个非空文本的条目。
tl;博士
如果您对验证器规则有非常具体的需求,您可以随时使用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();
编辑:我认为错误将具有特定值,因此以这种方式传递该值
return [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|array|between:1,3',
'wrong.text' => 'sometimes|min:1|in:somevalue,someothervalue',
];
sometimes
验证确保仅在存在的情况下检查字段。要检查是否至少会有
我不确定,但min
是否足以满足您的要求?否则,您必须按照其他人的建议编写自定义验证规则
如果要验证数组中的输入字段,可以像这样定义规则:
return [
'correct' => 'required|array',
'correct.text' => 'required',
'wrong' => 'required|array|between:1,3',
'wrong.*.text' => 'required|string|min:1',
];
以上是关于Laravel验证数组中至少需要一个元素的主要内容,如果未能解决你的问题,请参考以下文章