【问题标题】:Laravel 5 Multiple Fields ValidationLaravel 5 多字段验证
【发布时间】:2015-07-28 00:48:08
【问题描述】:

我在视图中有一个字段,类似于

<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>

等等...所以您可以想象它是一个动态字段,每次您勾选添加按钮或其他任何内容时都会添加到表单中。

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

谢谢!

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

谢谢大家!

【问题讨论】:

  • 您应该能够在评估期间使用点符号来访问嵌套数组项,因此请为new.descriptionnew.amount 创建规则

标签: validation laravel eloquent laravel-5


【解决方案1】:

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

<?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

因此您为每个带有输入的块添加带有错误消息的块。在我的示例中,仅处理了描述,您可以处理类似描述的数量 对我来说它有效并且看起来像

更新: Laravel 5.2 版具有数组验证,因此您可以创建请求验证器,例如:

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

更多信息请阅读DOC

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 2015-06-24
    • 2015-12-15
    • 2015-07-26
    • 2015-08-21
    • 2015-08-07
    • 2016-05-31
    • 1970-01-01
    相关资源
    最近更新 更多