php-tp5的validate自動驗證
以前都是自己寫程式碼驗證,學學tp5自帶的驗證功能。
首先使用驗證器驗證,在模組目錄下,建一個validate目錄,在其下面自定義要使用的驗證器,並讓它extends 框架的Validate類:
<?php namespace app\admin\validate; use think\Validate; class User extends Validate{ protected $rule = [ 'user_name' => 'require|max:20', 'password' => 'require', 'real_name' => 'require|max:12', 'email' => 'email', 'qq' => 'max:20', 'phone' => 'require|length:11', ]; }
這樣我們就有了一個針對user使用的自動驗證器,我們將要驗證的欄位,給他定義好對應的規則。
這裡注意:框架本身自帶的很多規則及其提示資訊,直接呼叫就好,如果不滿足需求,還支援自定義規則。
貼出框架原始碼:
// 驗證規則預設提示資訊 protected static $typeMsg = [ 'require' => ':attribute require', 'number' =>':attribute must be numeric', 'integer' => ':attribute must be integer', 'float' => ':attribute must be float', 'boolean' => ':attribute must be bool', 'email' => ':attribute not a valid email address', 'mobile' => ':attribute not a valid mobile', 'array'=> ':attribute must be a array', 'accepted' => ':attribute must be yes,on or 1', 'date' => ':attribute not a valid datetime', 'file' => ':attribute not a valid file', 'image' => ':attribute not a valid image', 'alpha' => ':attribute must be alpha', 'alphaNum' => ':attribute must be alpha-numeric', 'alphaDash' => ':attribute must be alpha-numeric, dash, underscore', 'activeUrl' => ':attribute not a valid domain or ip', 'chs' => ':attribute must be chinese', 'chsAlpha' => ':attribute must be chinese or alpha', 'chsAlphaNum' => ':attribute must be chinese,alpha-numeric', 'chsDash' => ':attribute must be chinese,alpha-numeric,underscore, dash', 'url' => ':attribute not a valid url', 'ip' => ':attribute not a valid ip', 'dateFormat' => ':attribute must be dateFormat of :rule', 'in' => ':attribute must be in :rule', 'notIn' => ':attribute be notin :rule', 'between' => ':attribute must between :1 - :2', 'notBetween' => ':attribute not between :1 - :2', 'length' => 'size of :attribute must be :rule', 'max' => 'max size of :attribute must be :rule', 'min' => 'min size of :attribute must be :rule', 'after' => ':attribute cannot be less than :rule', 'before' => ':attribute cannot exceed :rule', 'expire' => ':attribute not within :rule', 'allowIp' => 'access IP is not allowed', 'denyIp' => 'access IP denied', 'confirm' => ':attribute out of accord with :2', 'different' => ':attribute cannot be same with :2', 'egt' => ':attribute must greater than or equal :rule', 'gt' => ':attribute must greater than :rule', 'elt' => ':attribute must less than or equal :rule', 'lt' => ':attribute must less than :rule', 'eq' => ':attribute must equal :rule', 'unique' => ':attribute has exists', 'regex' => ':attribute not conform to the rules', 'method' => 'invalid Request method', 'token' => 'invalid token', 'fileSize' => 'filesize not match', 'fileExt' => 'extensions to upload is not allowed', 'fileMime' => 'mimetype to upload is not allowed', ];
我也沒一個一個試額。
驗證器有了,接下來就要使用了哈,嗯,文件中叫驗證情景,不對,是場景:
我是在user控制器中驗證,所以我寫在控制器中:
$validate= Loader::validate('User'); if(!$validate->check($data)){ dump($validate->getError()); }else{ dump($data); }載入自定義好的驗證器,然後使用check()方法。對傳入的資料進行驗證。失敗則獲取error,成功則輸出!
當然,tp5提供一個例項化驗證器的助手函式:
$validate= validate("User");我不喜歡用助手函式,不過功能實現就好。
不使用驗證器,直接在場景使用時定義規則,就是獨立驗證。
在例項化validate物件的時候,傳入你定義的規則即可,也可以使用rule()方法定義。寫法不同罷了。
同樣,上面所用的採用'|'來新增多個規則的寫法,也可以改為陣列的方法,陣列無處不在。。。
如果要改變提示資訊,也可以在驗證器中自定義:
<?php namespace app\admin\validate; use think\Validate; class User extends Validate{ protected $rule = [ 'user_name' => 'require|max:20', 'password' => 'require', 'real_name' => 'require|max:12', 'email' => 'email', 'qq' => 'number|max:20', 'phone' => 'require|length:11|number', ]; protected $message = [ 'user_name.require' => '名稱必須', 'user_name.max' => '名稱最多不能超過25個字元', 'qq.number' => 'qq必須是數字', 'phone.number' => '手機必須是數字', 'phone.max' => '請輸入11位手機號', 'email' => '郵箱格式錯誤', ]; }
控制器中使用批量驗證的話,我木有試額,批量驗證不通過返回的是一個錯誤陣列:
$validate =newValidate($rule, $msg);
$result = $validate->batch()->check($data);
上面一直使用的是框架自帶的規則,定義驗證規則:
1、使用了驗證器的話,只要在類中,定義函式
'user_name' => 'require|max:20|checkName:xinghua',自定義一個checkName規則:
// 自定義驗證規則 protected function checkName($value,$rule,$data){ return $rule == $value ? true : '名稱必須是xinghua'; }定義的規則名不能和已有的衝突哦;
2、沒使用驗證器的話,採用extend()方法定義
$validate->extend('checkName',function($value, $rule){
return $rule == $value ?true:'名稱錯誤';
});
還支援批量註冊規則,同樣是使用陣列。
定義欄位資訊,可以給對應的欄位新增描述:
protected $field = [ 'user_name' => '使用者名稱', 'password' => '密碼', 'real_name' => '姓名', 'email' => '郵箱', 'qq' => 'QQ', 'phone' => '手機' ];
在使用場景中,直接定義欄位,來限制當前驗證的欄位。
在驗證器中定義$scene:
protected $scene = [ 'register' => ['user_name','real_name','password','phone','email'], ];場景使用時,就需要加上scene()方法:
$validate->scene('register')->check($data)
顯然,我沒把qq欄位寫進去,設定的qq驗證規則木有生效。
在scene裡還可以重寫規則,
protected $scene =[
'edit'=>['name','age'=>'require|number|between:1,120'],
];
動態設定的話採用匿名函式:$validate->scene('edit',function($key,$data){
return'email'==$key && isset($data['id'])?true:false;
});
END;