Laravel 5多字段验证

时间:2015-05-16 00:33:15

标签: validation laravel eloquent laravel-5

我在视图中有一个字段,如



<div>
  <input type="text" name="new[0][description]" id="description-new-0">
  <input type="text" name="new[0][amount]" id="amount-new-0">
</div>

<div>
  <input type="text" name="new[1][description]" id="description-new-1">
  <input type="text" name="new[1][amount]" id="amount-new-1">
</div>
&#13;
&#13;
&#13;

依此类推...所以你可以想象它是一个动态字段,每当你勾选添加按钮或其他任何东西时都会在表单中添加。

问题是如何验证这些动态字段并为每个字段返回正确的错误?

谢谢!

请注意这是Laravel 5,但是如果你有一个类似于这个的Laravel 4解决方案,我猜(真的猜)它会起作用。

谢谢你们!

1 个答案:

答案 0 :(得分:6)

在文件夹中创建请求此表单的验证程序,如

<?php
use Illuminate\Foundation\Http\FormRequest;

class MultipleRequest extends FormRequest
{

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        $rules = [
            'description' => 'required|array',
        ];

        if ($this->request->get('description')) {
            foreach($this->request->get('description') as $key => $val)
            {
                $rules['description.'.$key] = 'required|min:7'; //example
            }
        }

        return $rules;
    }


    public function messages()
    {
        $messages = [];
        if ($this->request->get('description')) {
            foreach ($this->request->get('description') as $key => $val) {
                $messages['description.' . $key . '.min'] = 'Wrong field.';
                $messages['description.' . $key . '.required'] = 'This field required.';
            }
        }
        return $messages;
    }
}

更多信息How To: Validate an array of form fields with Laravel

然后在视图中执行下一步

@if (Session::has('_old_input'))
        @for ($i=0; $i<count(Session::get('_old_input.description')); $i++)
            <div>
                @if($errors->any() && Session::get('errors')->getBag('default')->has('description.' . $i))
                    <p class="">{{Session::get('errors')->getBag('default')->first('description.' . $i)}}</p>
                @endif


                <input type="text" name="new[][description]" id="description-new-{{$i}}" value="{{Session::get('_old_input.description.' . $i)}}">
                <input type="text" name="new[][amount]" id="amount-new-{{$i}}" value="{{Session::get('_old_input.amount.' . $i)}}">
            </div>
        @endfor
    @endif

所以你为带输入的每个块添加带错误消息的块。在我的例子中只处理了描述,金额你可以处理类似的描述 对于我的工作和看起来像 enter image description here

<强> UPD: Laravel 5.2版具有数组验证功能,因此您可以创建请求验证程序,如:

public function rules()
{
    return [
        'names.*' => 'required|max:50',
        'emails.*' => 'required|max:100',
    ];
}

了解更多信息,请阅读DOC