Laravel的表单验证

修改密码

form-request1.png

  • Confirmed

若是要验证的字段是 password,输入中必须存在匹配的 password_confirmation 字段。php

  • Different

验证的字段值必须与参数字段的值不一样。html

public function rules() {

    return [
        //...
        'password' => 'bail|required|string|between:8,20|confirmed|different:old_password',
        'password_confirmation' => 'bail|required|string|between:8,20'
        //...
    ];

}

验证数组

一般咱们的 tags 前端一般会写成这个样子:前端

<input name='tags[]' >

而后在后端能够经过多对多的关联来实现这个添加标签的功能,可是其实咱们仔细地想:咱们添加标签的时候但愿达到什么样的效果呢?我以为有下面两个最简单的:mysql

  1. 这个标签的 tags[] 是不能为空的。
  2. 一旦 tags[] 不为空,里面的每个元素(标签)应该是惟一的。

因此在验证的时候,咱们能够这样:sql

Validator::make($request->all(), [    
  "tags" => 'required|array',    
  "tags.*" => 'required|string|distinct|min:3',
]);

这里须要解释一下,第一条后端

"tags" => 'required|array',

是代表这是一个不能为空的数组,而后第二条数组

"tags.*" => 'required|string|distinct|min:3',

就是说:tags 数组里面每一个元素我但愿是 string ,并且是惟一的 (distinct),每一个元素最小的长度为 3。less

Bail

第一次验证失败后中止运行验证规则。
只是中止这个字段的验证,其它字段不影响。ui

messages()和attributes()

messages()attributes() 继承于Illuminate\Foundation\Http\FormRequest,能够重写验证字段的含义和提示信息。this

public function messages() {
    return [
        'password.confirmed' => '两次输入的密码不一致!',
        'password.different' => '新密码与旧密码不能一致!'
    ];
}

authorize()

检查通过身份验证的用户肯定其是否具备更新给定资源的权限。
若是 authorize() 方法返回 false,则会自动返回一个包含 403 状态码的 HTTP 响应,也不会运行控制器的方法。

public function authorize() {
    return true;
}

Unique

第一种写法:unique:(链接名)表名,表中对应字段,忽略值,表主键

  1. 当字段名和表中字段相等时可省略
  2. 忽略值通常用于修改判断时去掉本身
  3. 表主键为id时可省略
public function rules() {
    return [
        'name' => 'required|string|unique:mysql.sometable,name',
        //...
    ];
}

第二种写法:使用Illuminate\Validation\Rule中的unique()静态方法

public function rules() {
    $id = $this->get('id');

    return [
        'id' => 'required|integer',
        'name' => [
            'required',
            'string',
            Rule::unique('mysql.sometable')->ignore($id, 'id')
        ],
        //...
    ];
}

还有其余查询条件时,能够链式使用where()等方法

public function rules() {
    $stationId = $this->get('station_id');

    return [
        //...
        'car_number' => [
            'required',
            'string',
            Rule::unique('queue')->where(function ($query) use ($stationId) {
                $query->where([
                    ['station_id', $stationId],
                    ['cancel_state', 0]//未取消
                ])->whereDate('create_time', today()->toDateString());
            })//排队中不容许重复
        ],
        //...
    ];
}

Required

有许多规则,视实际状况使用:

  • required_if
  • required_unless
  • required_with
  • required_with_all
  • required_without
  • required_without_all

举个例子

public function rules() {
    return [
        'tel' => 'required_without_all:mobile,email,address',
        'mobile' => 'required_without_all:tel,email,address',
        'email' => 'required_without_all:tel,mobile',
        'address' => 'required_without_all:tel,mobile',
    ];
}

public function messages() {
    return [
        'tel.required_without_all' => '当手机号码、Email、地址都为空时,电话号码不能为空',
        'mobile.required_without_all' => '当电话号码、Email、地址都为空时,手机号码不能为空',
        'email.required_without_all' => '当电话号码、手机号码都为空时,Email和地址不能同时为空',
        'address.required_without_all' => '当电话号码、手机号码都为空时,Email和地址不能同时为空'
    ];
}
相关文章
相关标签/搜索