一.驗證器定義
1. 驗證器的使用,我們必須先定義它,系統提供了一條命令直接生成想要的類;
php think make:validate User
2. 這條命令會自動在應用目錄下生成一個validate文件夾,并生成User.php類;
class User extends Validate
3. 自動生成了兩個屬性:$rule表示定義規則,$message表示錯誤提示信息;
protected $rule = ['name'=>'require|max:20','price'=>//不得為空,不得大于20位
'number|between:1,100', //必須是數值,1-100 之間
'email'=>'email'];protected $message = ['name.require'=>'姓名不得為空','name.max'=>'姓名不得大于20位','price.number'=>'價格必須是數字','price.between'=>'價格必須1-100之間','email'=>'郵箱的格式錯誤'];
4. 如果不設置$message定義的話,將提示默認的錯誤信息;
5. 驗證器定義好了之后,我們需要進行調用測試,創建一個Verify.php控制器;
try {validate(User::class)->check(['name' => '蠟筆小新','price' => 90,'email' => 'xiaoxin@163.com']);} catch (ValidateException $e) {dump($e->getError());}
6. 默認情況下,出現一個錯誤就會停止后面字段的驗證,我們也可以設置批量驗證;
validate(User::class)->batch(true)...
由于出現一個錯誤,后面就會停止,使用我們要應用batch:
只能顯示一個錯誤,但是后面的兩個也是錯的。
下面這個圖片的batch位置寫錯了:
正確寫法:
7. 系統提供了常用的規則讓開發者直接使用,也可以自行定義獨有的特殊規則;
protected $rule = ['name'=>'require|max:20|checkName:李炎恢',];//自定義規則,名稱中不得是“李炎恢”protected function checkName($value, $rule){return $rule != $value ? true : '名稱存在非法稱謂';}
8. 對于自定義規則中,一共可以有五個參數,我們分別了解一下;
protected function checkName($value, $rule, $data, $field, $title){dump($data);//所有數據信息
dump($field);//當前字段名
dump($title);//字段描述,沒有就是字段名
}
1.?checkName
方法參數傳值
$value
:它代表的是被驗證字段的實際值。例如,若要驗證name
字段,那么$value
就是name
字段在表單提交時所攜帶的值。$rule
:此為驗證規則中自定義規則之后的額外參數。就像'checkName:thinkphp'
里,$rule
的值就是thinkphp
。$data
:它是一個數組,包含了所有需要驗證的數據。默認值為空數組[]
,在驗證時,整個待驗證的數據數組會被傳遞給這個參數。
9. 如何設置字段描述,只要在字段名用|后設置即可: 'name|用戶名' => 'require|max:20|checkName:李炎恢',
<?php
namespace app\validate;use think\Validate;class User extends Validate
{protected $rule = ['name' => 'checkName:thinkphp','email' => 'email',];protected $message = ['name' => '用戶名必須','email' => '郵箱格式錯誤',];// 自定義驗證規則protected function checkName($value, $rule, $data=[]){return $rule == $value ? true : '名稱錯誤';}
}// 調用驗證類
$validate = new User();
$data = ['name' => 'thinkphp','email' => 'test@example.com'
];if (!$validate->check($data)) {dump($validate->getError());
} else {echo '驗證通過';
}
代碼解釋
- 在上述代碼中,當調用
$validate->check($data)
時,name
字段的值'thinkphp'
會被傳遞給checkName
方法的$value
參數。 'checkName:thinkphp'
里的thinkphp
會被傳遞給checkName
方法的$rule
參數。- 整個
$data
數組會被傳遞給checkName
方法的$data
參數。
這樣,在checkName
方法中就能依據$value
和$rule
的值進行驗證,并返回驗證結果。
驗證規則
有的時候只對數據進行局部的驗證,而不是全局。
1.在上一節驗證器定義的時候,我們采用的字符串模式,也支持數組模式;
protected $rule =['name' => ['require','max' => 10,'checkName' => '李炎恢'],'price' => ['number','between' => '1,100'],'email' => 'email'];
2.數組模式在驗證規則很多很亂的情況下,更容易管理,可讀性更高;
3.如果你想使用獨立驗證,就是手動調用驗證類,而不是調用User.php驗證類;
第一個是定義規則,第二個是驗證規則:
4.這種調用方式,一般來說,就是獨立、唯一,并不共享的調用方式;
$validate = Validate::rule(['name' => 'require|max:20','price' => 'number|between:1,100','email' => 'email']);$result =$validate->check(['name' => '李炎恢','price' => 90,'email' => 'xiaoxin163.com']);if(!$result){dump($validate->getError());}
5. 獨立驗證默認也是返回一條錯誤信息,如果要批量返回所有錯誤使用batch();
$result = $validate->batch(true)->check
6. 獨立驗支持對象化的定義方式,但不支持在屬性方式的定義;
$validate = Validate::rule(['name'=>ValidateRule::isRequire()->max(20),'price'=>ValidateRule::isNumber()->between([1, 100]),'email'=>ValidateRule::isEmail()]);
8. 獨立驗支持閉包的自定義方式,但這種方式會不支持字段的多規則;
$validate = Validate::rule(['name' => function ($value) {return $value != '' ? true : '姓名不得為空';},'price'=> function ($value) {return $value > 0 ? true : '價格不得小于零';}]);
二.錯誤信息
1. 獨立驗證的自定義錯誤提示,可以在方法的第二參數,參數一是規則;
ValidateRule::isEmail(null, '郵箱格式不正確!');ValidateRule::isNumber()->between([1, 100], '價格范圍1-100 之間')
2. 也可以獨立使用message()方法,來設置相關錯誤信息;
$validate->message(['name.require' => '姓名不得為空','name.max' =>'姓名不可以超過20個子']);'name.require'=>['code'=>1001, 'msg'=>'姓名不得為空']