Laravel 5.2验证器:验证阵列请求参数,必须至少选择一个值

时间:2016-03-28 10:39:49

标签: php validation laravel-5.2

我有一个表格,我有标题,正文,答案[] [答案]和选项[] [选项]。

我想至少必须为给定的问题选择一个答案,例如:

我有ABC个问题并且该问题有5个选项,现在必须检查至少一个答案或者针对给定问题的所有答案。

努力

protected $rules = [
            'title' => 'required|unique:contents|max:255',
            'body' => 'required|min:10',
            'type' => 'required',
            'belongsto' => 'sometimes|required',
            'options.*.option' => 'required|max:100',
            'answers.*.answer' => 'required',
        ];

但这不起作用。我想至少必须选择一个答案。

请帮帮我。

2 个答案:

答案 0 :(得分:1)

问题是,在$ _POST上,如果没有选择答案,将传递一个填充空字符串的数组。

$answers[0][0] = ''
$answers[0][1] = ''
$answers[0][2] = ''

因此,由于空字符串,数组计数将大于零,因此以下操作无效:

 $validator = Validator::make($request->all(), [
    'answers.*'   => 'required'
  ]);

解决此问题的最简单方法是使用Laravel的Validator :: extend函数创建自定义Validator规则。

  Validator::extendImplicit('arrayRequireMin', function($attribute, $values, $parameters)
  {
      $countFilled = count(array_filter($values));
      return ($countFilled >= $parameters[0]);
  });

然后在验证请求中调用它:

  $validator = Validator::make($request->all(), [
    'answers.*'   => 'arrayRequireMin:1'
  ]);

魔术发生在array_filter()中,它从数组中删除所有空属性。现在,您可以设置所需的任何最小答案数。

Validator :: extendImplicit()vs Validator :: extend()

  

要使规则在属性为空时运行,规则必须暗示该属性是必需的。创造这样一个隐含的"扩展,使用Validator :: extendImplicit()方法:

Laravel's validation docs

答案 1 :(得分:0)

试试这个,

app:onClick="@{handler::onItemClick}"
它会帮助你。我想。