掌握Thinkphp3.2.0----自動驗證


自動驗證是TP在create數據的時候,自動對數據進行驗證。

TP提供了兩種驗證方式:靜態驗證($_validate屬性----自定義的模型的)和validate()方法

1.靜態驗證-----$_validate屬性

總體的格式: 

 1 <?php  
 2     namespace Home\Model;
 3     use Think\Model;
 4     class UserModel extends Model{
 5         
 6         protected $_validate = array(
 7             array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),
 8                           .......多個字段驗證
 9         );
10     }
11 ?>

  驗證字段----驗證規則-----錯誤提示-----驗證條件-----附加規則----驗證時間

紅色的是必選字段,黑色的是附加字段

驗證字段:顧名思義,就是需要驗證的字段

驗證規則:系統內置或自定義的規則

錯誤提示:在驗證失敗的時候做出的返回的信息

驗證條件:      

      1.self::EXISTS_VALIDATE 或 0,表示存在字段就驗證(默認) ;
      2.self::MUST_VALIDATE 或 1,表示必須驗證;
      3.self::VALUE_VALIDATE 或 2,表示值不為空的時候驗證。

附近規則:

      配合驗證規則使用,包括一下規則:

驗證時間:

主要新增修改等驗證。
1.self::MODEL_INSERT 或 1 新增數據時驗證;
2.self::MODEL_UPDATE 或 2 編輯數據時驗證;
3.self::MODEL_BOTH 或 3 全部情況下驗證(默認)。

自動驗證是從上到下以此驗證,上面的錯誤,下面不會有錯誤信息返回

其實自動驗證是很簡單的,熟悉規則之后來看一下實例:

內置驗證規則:

 1 模型
 2 <?php  
 3     namespace Home\Model;
 4     use Think\Model;
 5     class UserModel extends Model{
 6         
 7         //系統支持數據的批量驗證功能,只需要在模型類里面設置patchValidate屬性為true( 默認為false),
 8         //設置批處理驗證后,getError() 方法返回的錯誤信息是一個數組
 9         protected $patchValidate = true;
10         protected $_validate = array(
11 
12             //為了便於模擬,我用的是驗證條件是1,也就是在任何條件下都驗證,其實所用的字段可能是不存在的
13             //是不能夠創建數據的
14             //內置驗證require不能為空
15             array('require','require','數據不能為空!',1),
16             //內置驗證email,驗證郵箱格式
17             array('email','email','郵箱格式不正確',1),
18             //內置驗證url,驗證網址
19             array('url','url','URL地址不正確',1),
20             //內置驗證currency,驗證貨幣
21             array('currency','currency','貨幣格式不正確',1),
22             //內置驗證zip,驗證郵編
23             array('zip','zip','郵政編碼不正確',1),
24             //內置驗證number,驗證是不是正整數
25             array('number','number','不是正整數',1),
26             //內置驗證integer,驗證是不是整數
27             array('integer','integer','不是整數',1),
28             //內置驗證double,驗證是不是浮點數,正負均可
29             array('double','double','不是浮點數',1),
30             //內置驗證english,驗證是不是純英文
31             array('english','english','不是純英文',1),
32         );
33     }
34 ?>
35 
36 
37 控制器:
38 
39 <?php
40 // 本類由系統自動生成,僅供測試用途
41 namespace Home\Controller;
42 use Think\Controller;
43  use Common\Model\UserModel;
44 class IndexController extends Controller {
45 
46     public function index(){
47 
48         $user = D('User');
49 
50         //用數組的方式模擬數據的提交
51         $data['require'] = '';
52         $data['email'] = 'sjdjjd';
53         $data['url'] = 'aaa';
54         $data['currency'] = '-1.2';
55         $data['zip'] = '123';
56         $data['number'] = -1;
57         $data['integer'] = -1.2;
58         $data['double'] = '21s';
59         $data['english'] = '12ee';
60         if($user->create($data)){
61             echo "驗證成功!";
62         }else{
63             var_dump($user->getError());
64         }
65     }
66 }

 

結果:

附加:

 1 //附加規則regex,驗證3-6位純數字
 2 array('user', '/^\d{3,6}$/', '不是 3-6 位純正數字', 0, 'regex'),
 3 //附加規則equal,驗證是否和指定值相等
 4 array('user', '李炎恢', '值不對等', 0, 'equal'),
 5 //附加規則notequal,驗證是否與指定值不等
 6 array('user', '李炎恢', '值不能相等', 0, 'notequal'),
 7 //附加規則confirm,驗證兩條字段是否相同
 8 array('user', 'name', '兩個用戶名對比不同!',0,'confirm'),
 9 //附加規則in,某個范圍,可以是數組或逗號分割的字符串
10 array('user',  array(1,2,3), '不在指定范圍', 0, 'in'),
11 array('user', '張三,李四,王五', '不在指定范圍', 0, 'in'),
12 //附加規則notin,某個范圍,可以是數組或逗號分割的字符串
13 array('user',  array(1,2,3), '不得在指定范圍', 0, 'notin'),
14 array('user', '張三,李四,王五', '不得在指定范圍', 0, 'notin'),
15 //附加規則length,驗證長度或數字范圍
16 array('user', '3', '不得小於 3 位', 0, 'length'),
17 array('user', '3,5', '不得小於 3 位,不得大於 5 位', 0, 'length'),
18 //附加規則between,驗證某個范圍,數字或逗號字符串
19 array('user',  array(3,5), '必須是 3-5 之間的數字', 0, 'between'),
20 array('user', '3,5', '必須是 3-5 之間的數字', 0, 'between'),
21 //附加規則notbetween,驗證某個范圍,數字或逗號字符串
22 array('user',  array(3,5), '必須不是 3-5 之間的數字', 0, 'notbetween'),
23 array('user', '3,5', '必須不是 3-5 之間的數字', 0, 'notbetween'),
24 //附加規則expire,設置有效期范圍,必須是表單提交有效,可以是時間戳
25 array('user', '2014-1-10,2015-10-10', '時間已過期', 0, 'expire'),
26 //附加規則ip_deny,IP禁止列表
27 array('user', '127.0.0.1', '當前 IP 被禁止', 0, 'ip_deny'),
28 //附加規則ip_allow,IP允許列表
29 array('user', '127.0.0.1', '當前 IP 沒有被允許', 0, 'ip_allow'),
30 //附加規則callback,回調驗證
31 array('user', 'checkLength', '用戶名必須在 3-5 位', 0, 'callback', 3,
32 array(3,5)),
33 //回調方法
34 protected n function checkLength($str,$min,$max) {
35 preg_match_all("/./u", $str, $matches);
36 $len = count($matches[0]);
37 if ($len < $min || $len > $max) {
38 return  false;
39 }  else {
40 return  true;
41 }
42 }
43 //附加規則function,函數驗證
44 array('user', 'checkLength', '用戶名必須在 3-5 位', 0, 'function', 3,
45 array(3,5)),
46 //在 Common 文件夾下的 Common 文件夾建立 function.php 文件,會自動加載
47 function checkLength($str,$min,$max) {
48 preg_match_all("/./u", $str, $matches);
49 $len = count($matches[0]);
50 if ($len < $min || $len > $max) {
51 return  false;
52 } e else {
53 n return  true;
54 }
55 }
56 如果有多個字段都包含錯誤,默認只顯示一個錯誤。如果想顯示全部錯誤,可以設置屬
57 性:
58 //批量驗證
59 d protected $patchValidate =  true;
60 如果是直接 POST 過來的,直接使用 create()方法即可。
61 //控制器create()方法自動調用驗證
62 $user = D('User');
63 if ($user->create()) {
64 echo '所有數據驗證成功!';
65 }  else {
66 //輸出錯誤信息
67 var_dump($user->getError());
68 }
69 PS:由於使用的 UserModel 模型類,所以必須是 D()方法實例化。
70 如果想把錯誤信息返回給ajax處理,可以是同ajaxReturn()方法返回JSON數據。
71 //返回JSON格式
72 $this->ajaxReturn($user->getError());
73 //1指定新增數據驗證,2表示修改,
74 f if ($user->create($_POST,1)) {} //一般會自動判斷

 

回調和函數是終極的自定義,還是很強大的

2.動態驗證----動態驗證就是把驗證的規則放在控制器端,這樣,在操作的時候比較靈活,缺點就是比較混亂。

 1 //動態驗證
 2 $rule =  array(
 3 array('user', 'require', '用戶名不得為空'),
 4 );
 5 $user = M('User');
 6 $data['user'] = '';
 7 if ($user->validate($rule)->create($data)) {
 8 echo '驗證所有字段成功!';
 9 } e else {
10 var_dump($user->geterror());
11 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM