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和地址不能同時爲空'
    ];
}
相關文章
相關標籤/搜索