注:示例來源于官方手冊
一、驗證器定義
驗證器用于對數據進行驗證,你可以理解為一個“層”,在傳入數據時可以使用這個層對數據進行驗證,這樣就可以不用頻繁的在方法中編寫代碼去驗證,只需要編寫一個驗證層即可,此操作需要自己編寫對應的代碼,本節只是介紹驗證器的使用。
此時我們在 app 目錄下新建一個 validate 文件夾,在其中新建一個 User.php 假設用于用戶傳入的用戶信息進行驗證。
隨后在 User.php 中編寫如下代碼:
<?php
namespace app\validate;
use think\Validate;class User extends Validate
{protected $rule = ['name' => 'require|max:25','age' => 'number|between:1,120','email' => 'email', ];protected $message = ['name.require' => '名稱必須','name.max' => '名稱最多不能超過25個字符','age.number' => '年齡必須是數字','age.between' => '年齡只能在1-120之間','email' => '郵箱格式錯誤', ];}
以上代碼中可以看到,當前 User 類繼承至驗證器 Validate 類,其中 protected 的屬性 rule 是表示驗證規則,為一個數組;name 表示這個字段名 require 表示為必須,并且 max 最大字符不能超過 25個;age 是 number 類型數據,在 1-120 之間,同一個字段多個不同的規則使用 | 進行分隔,若只有一個規則就如同 email 字段的規則是 email 表示是郵件字段。
在此還發現了 message 屬性,其中指定了每個規則驗證不通過時的提示信息。
二、驗證器使用方法
以下是一個最簡單的驗證器使用方法:
public function userValidate(){try {validate(User::class)->check(['name' => 'thinkphp','email' => 'thinkphpcom',]);} catch (ValidateException $e) {// 驗證失敗 輸出錯誤信息dump($e->getError());}
}
當驗證器驗證錯誤將會拋出異常,并且會中斷驗證,使用驗證器很簡單,use 之后直接使用 validate(User::class)指定驗證器后使用 check 方法即可。在 check 方法中需要傳入一個數組,數組值為需要驗證字段的信息,在以上示例中我的 email 是錯誤的郵箱編寫格式,此時將會拋出異常:
三、設置批量驗證
在以上一點中已經說過,驗證是會中斷的,若有多個錯誤信息時,需要批量驗證的話可以設置 batch 為 true 即可,如下示例:
public function userValidate(){try {validate(User::class)->batch(true)->check(['name' => 'thinkphp','age' => 130,'email' => 'thinkphpcom',]);} catch (ValidateException $e) {// 驗證失敗 輸出錯誤信息dump($e->getError());}
}
以上實例中,我的 age 值明顯大于了本身規則的限定在 120 以內,所以此時將會拋出兩個提示:
四、自定義驗證規則
驗證器還支持自定義的驗證規則,例如以下示例,首先是 user 驗證器中:
class User extends Validate
{protected $rule = ['name' => 'require|checkName:敏感字,','age' => 'number|between:1,120','email' => 'email', ];protected $message = ['name.require' => '名稱必須','name.max' => '名稱最多不能超過25個字符','age.number' => '年齡必須是數字','age.between' => '年齡只能在1-120之間','email' => '郵箱格式錯誤', ];// 自定義驗證規則protected function checkName($value, $rule, $data=[]){return $rule == $value ? true : '敏感字符';}}
此時修改了 rule 的驗證規則 name,其中有一個 checkName 規則是我們自定義的方法,二冒號后面的敏感字是該方法的參數,隨后我們可以查看方法 checkName,其中 value 是需要驗證的字符,rule 是敏感字,data 是所有需要驗證的信息數組;接著我們傳入對應的變量:
try {validate(User::class)->batch(true)->check(['name' => '敏感字','age' => 110,'email' => '123@163.com',]);
} catch (ValidateException $e) {// 驗證失敗 輸出錯誤信息dump($e->getError());
}
此時將會拋出異常:
五、手動使用驗證器
驗證器還支持自己手動編寫規則,自行調用,如下示例:
public function userValidate(){$validate = \think\facade\Validate::rule('age', 'number|between:1,120')->rule(['name' => 'require|max:25','email' => 'email']);$data = ['name' => 'thinkphp','email' => 'thinkphp'];if (!$validate->check($data)) {dump($validate->getError());}
}
手動調用方式大致相同,初始化規則創建驗證器對象后,在使用check 時進行check 即可。
更多驗證規則可以查看手冊:https://www.kancloud.cn/manual/thinkphp6_0/1037629
且官方還提供了路由驗證、令牌、注解驗證 等驗證,可以自行查看官方手冊,本專欄只介紹一般方法。