Laravel验证数组中至少需要一个元素

时间:2017-06-09 09:24:57

标签: php laravel validation laravel-5 laravel-5.2

我正在尝试将以下数据发布到在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.现在这些规则令人满意,但还有一个案例我需要采取护理,这是textwrong的验证。根据当前规则,如果我发布上述数据,则会接受,因为text部分中的wrong没有适用的规则。我需要添加哪条规则来验证wrong部分是否至少包含一个非空文本的条目。

4 个答案:

答案 0 :(得分:1)

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();

答案 1 :(得分:0)

利用validation rule in

编辑:我认为错误将具有特定值,因此以这种方式传递该值

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