Laravel 5 多字段验证

Posted

技术标签:

【中文标题】Laravel 5 多字段验证【英文标题】:Laravel 5 Multiple Fields Validation 【发布时间】: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 创建规则 【参考方案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

【讨论】:

以上是关于Laravel 5 多字段验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 中的多字段排序

Laravel 5.6 空字段验证

在 Laravel 5 中验证动态添加的输入字段

Laravel 5.7 具有 JSON 字段类型的存在/唯一验证

Laravel 5 & 在单个字段中验证多个电子邮件地址

仅当需要字段时,Laravel 5.5 验证最小长度