laravel5.5表单验证 1. 在第一次验证失败后停止# 2. 嵌套参数 3. AJAX 请求 & 验证# 4. 表单请求 5. 两种方式 6. 占位符 7. 获取错误消息

有时,你希望在某个属性第一次验证失败后停止运行验证规则。为了达到这个目的,附加 bail 规则到该属性:

$this->validate($request, [
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required',
]);

2. 嵌套参数

如果你的 HTTP 请求包含一个 「嵌套」 参数(即数组),那你可以在验证规则中通过 「点」 语法来指定这些参数。

$this->validate($request, [
    'title' => 'required|unique:posts|max:255',
    'author.name' => 'required',
    'author.description' => 'required',
]);

3. AJAX 请求 & 验证#

我们使用传统的表单将数据发送到应用程序。但实际情况中,很多程序都会使用 AJAX 来发送请求。当我们对 AJAX 的请求中使用 validate 方法时,Laravel 并不会生成一个重定向响应,而是会生成一个包含所有验证错误信息的 JSON 响应。这个 JSON 响应会包含一个 HTTP 状态码 422 被发送出去。

4. 表单请求

创建文件

php artisan make:request StoreBlogPost

文件展示

<?php

namespace AppHttpRequests;

use IlluminateFoundationHttpFormRequest;
use IlluminateHttpRequest;

class StoreServergroupPost extends FormRequest
{

    //表单授权
    public function authorize()
    {
        //这里可以做一些权限验证
        //return false;
        return true;
    }

    public function rules(Request $request)
    {
        $rules = [ 
            'name' => 'required',
            'selectedMaster' => 'required',
            'selectedFailover' => 'required',
        ];  
        if($request->selectedFailover){
            $rules['selectedSlave'] = 'required';
            $rules['tableData'] = 'required';
        }   
        return $rules;

    }

    public function messages()
    {
        return [
            'name.required' => '请输入集群名称',
            'selectedMaster.required'  => '请选择主服务器',
            'selectedFailover.required'  => '请选择是否开启',
            'selectedSlave.required'  => '请选择从服务器',
            'tableData.required'  => '网卡信息不能为空',
        ];
    }
    
    //请求之后的钩子
    public function withValidator($validator)
    {
        $validator->after(function ($validator) {
            if ($this->somethingElseIsInvalid()) {
                $validator->errors()->add('field', 'Something is wrong with this field!');
            }
        });
    }

}

控制器类上面引入

use AppHttpRequestsStoreServergroupPost;

控制器方法中使用此类

//这里的类型提示不是Request了
public function store(StoreServergroupPost $request)
{
    // The incoming request is valid...
}

5. 两种方式

  • 1> 使用validate方法

  • 2> 手动创建验证器实例


$v = Validator::make($input, $rule,$message);

if($v->fails()){
   //return xxxx
}

还可以加验证后的钩子

$validator = Validator::make(...);

$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
});

if ($validator->fails()) {
    //
}

需要注意的是

  • 使用validate方法直接返回json,并且第一个参数是$request对象,
  • 手动创建的话可以使用$errors = $validator->errors()->toArray();获取错误信息

6. 占位符

:attribute 占位符会被验证字段的实际名称取代。除此之外,你还可以在验证消息中使用其他占位符。例如:

$messages = [
    'same'    => 'The :attribute and :other must match.',
    'size'    => 'The :attribute must be exactly :size.',
    'between' => 'The :attribute must be between :min - :max.',
    'in'      => 'The :attribute must be one of the following types: :values',
];

7. 获取错误消息

$errors = $validator->errors();

查看特定字段的第一个错误消息#

echo $errors->first('email');

如果你想以数组的形式获取指定字段的所有错误消息,则可以使用 get 方法:

foreach ($errors->get('email') as $message) {
    //
}

如果要验证表单的数组字段,你可以使用 * 来获取每个数组元素的所有错误消息:

foreach ($errors->get('attachments.*') as $message) {
    //
}

所有字段的错误消息,可以使用 all 方法:

foreach ($errors->all() as $message) {
    //
}

判断特定字段是否含有错误消息#

if ($errors->has('email')) {
    //
}