亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ThinkPHP自動驗證分析

發布時間:2020-08-06 15:29:45 來源:網絡 閱讀:1012 作者:小海哥2010 欄目:web開發

今天一起來學習下TP的自動驗證具體是怎么實現的,首先驗證規則的定義格式如下:

// 驗證因子定義格式

array(field,rule,message,condition,type,when,params)

field:驗證字段的名稱

rule:驗證表達式

message:錯誤信息

condition:驗證條件,0存在就驗證 1 必須驗證 2值不為空時驗證

type:驗證方式

when:什么時候驗證 1插入時 2 更新時 3兩種情況都驗證

params:額外參數,當驗證規則類型為function,callback等時用到


1.TP里定義的驗證方式有哪些呢?

function,callback函數或回掉方法驗證

confirm驗證兩個字段的值是否相同

unique唯一性驗證

in, not in指定范圍驗證,逗號分隔字符串后數組

between, not between指定范圍驗證

equal, notequal值等于或不等于驗證

length長度驗證

expire有效期驗證

ip_allow,ip_deny IP驗證

regex:正則驗證

2.正則驗證TP里定義的有哪些?

 'require'   =>  '/\S+/', //是否為空
 'email'     =>  '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/' , //email驗證規則
 'url'       =>  '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(:\d+)?(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/' , //url規則
 'currency'  =>  '/^\d+(\.\d+)?$/' , //貨幣規則
 'number'    =>  '/^\d+$/' , //數字驗證規則
 'zip'       =>  '/^\d{6}$/', //
 'integer'   =>  '/^[-\+]?\d+$/' , //×××驗證規則
 'double'    =>  '/^[-\+]?\d+(\.\d+)?$/' , //double類型規則
 'english'   =>  '/^[A-Za-z]+$/' , //英文字母驗證

3.源碼分析

①自動表單驗證方法 autoValidation

TP里當調用create方法時會自動調用該方法進行自動驗證,首先看該方法的這一段:

 if( empty ($val[5]) || ( $val[5]== self:: MODEL_BOTH && $type < 3 ) || $val[5]== $type ) {
     ......
     }

這里判斷是否需要執行驗證,如果驗證時間為空,或者驗證時間為3(插入和更新時都驗證)或者驗證時間等于給定的參數$type(1,2)則驗證,舉個例子

protected $_validate = array(
     array('title','require','title can not be blank'); //$val[5]為空
     array('title','','title should be uqiue',1,'unique',1);

);

例如:if($model->create($data,1)){ .... },那么此時表示插入時驗證,傳入2表示更新時驗證,那么$_validate里有對應的$val[5]值得規則就會被驗證

再來看下驗證條件

// 判斷驗證條件

 switch ($val[3]) {
    case self ::MUST_VALIDATE :   // 必須驗證 不管表單是否有設置該字段
     if (false === $this->_validationField($data,$val))
          return false ;
   break ;
   case self ::VALUE_VALIDATE :    // 值不為空的時候才驗證
       if ('' != trim($data[$val[0]]))
          if (false === $this->_validationField($data,$val))
              return false ;
   break ;
    default :    // 默認表單存在該字段就驗證
      if (isset ($data[$val[0]]))
        if (false === $this->_validationField($data,$val))
              return false ;
     }

這里Model.class.php類里定義了6個常量,分別是:

const MODEL_INSERT          =   1;      //  插入模型數據
const MODEL_UPDATE          =   2;      //  更新模型數據
const MODEL_BOTH            =   3;      //  包含上面兩種方式
const MUST_VALIDATE         =   1;      // 必須驗證
const EXISTS_VALIDATE       =   0;      // 表單存在字段則驗證
const VALUE_VALIDATE        =   2;      // 表單值不為空則驗證

上面的代碼表示$val[3]如果為1時,必須驗證 為2時,表單字段的值不為空時才驗證,默認是存在該字段就驗證。

②好,那么下面來分析下具體是怎么驗證的?

_validationField方法傳入了兩個參數,一是表單提交的數組$data,二是驗證規則數組

仔細分析下該方法里的這段代碼:

 if( false === $this->_validationFieldItem($data,$val)){
     if ($this->patchValidate ) {//批量驗證
          $this-> error[$val[0]]   =   $val[2];
      } else {//單個驗證
          $this-> error    =   $val[2];
             return false ;
      }
  }

這里$this->patchValidate表示是否批量處理驗證,如果為true,則驗證不通過時返回的錯誤信息為一數組,否則就行單個驗證,返回的錯誤信息為字符串。

③驗證方式

_validationFieldItem方法里定義了常見的驗證方式,像function,callback,unique,confirm等這些驗證,否則檢查附加規則

switch (strtolower(trim($val[4]))) {
   case 'function': // 使用函數進行驗證
   case 'callback': // 調用方法進行驗證
     $args = isset ($val[6])?(array)$val[6]: array();
     if (is_string($val[0]) && strpos($val[0], ',' ))
       $val[0] = explode( ',', $val[0]);
       if (is_array($val[0])){
         // 支持多個字段驗證
         foreach ($val[0] as $field)
           $_data[$field] = $data[$field];
             array_unshift($args, $_data);
       } else {
            array_unshift($args, $data[$val[0]]);
       }
       if ('function' ==$val[4]) {
           return call_user_func_array($val[1], $args);
        } else {
           return call_user_func_array( array(&$this, $val[1]), $args);
       }
                 ......
     default :  // 檢查附加規則
       return $this->check($data[$val[0]],$val[1],$val[4]);
   }

     附加規則方法check里定義里常見的像in,not in,between,not between,equal等驗證方式,如果不符合這些驗證方式的話,默認為regex正則驗證

④正則驗證

TP里把驗證規則分別定義到了三個方法里,_validationFieldItem里定義了像function,unique這些驗證規則,check里定義了in,not in等常見的附加規則,這些都不滿足的話則調用regex方法進行正則驗證

$validate = array(
     'require'   =>  '/\S+/' ,
     'email'     =>  '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/' ,
     'url'       =>  '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(:\d+)?(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/' ,
     'currency'  =>  '/^\d+(\.\d+)?$/' ,
     'number'    =>  '/^\d+$/' ,
     'zip'       =>  '/^\d{6}$/',
     'integer'   =>  '/^[-\+]?\d+$/' ,
     'double'    =>  '/^[-\+]?\d+(\.\d+)?$/' ,
     'english'   =>  '/^[A-Za-z]+$/' ,
     );
     // 檢查是否有內置的正則表達式
     if (isset ($validate[strtolower($rule)]))
       $rule       =   $validate[strtolower($rule)];
     return preg_match($rule,$value)===1;


從源碼里可以看出TP自己定義了一些正則驗證的規則,如果不滿足這些,那么就要傳入自定義的正則表達式,最后執行preg_match($rule,$value)===1


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

韶关市| 忻城县| 鱼台县| 临潭县| 怀仁县| 巍山| 文山县| 合川市| 毕节市| 博爱县| 临猗县| 新化县| 营口市| 且末县| 滨州市| 张家川| 河南省| 奇台县| 青浦区| 卫辉市| 北海市| 新闻| 龙岩市| 弋阳县| 义马市| 上犹县| 大新县| 乐业县| 炉霍县| 合山市| 康马县| 娱乐| 南华县| 鹿邑县| 江源县| 区。| 应城市| 襄汾县| 德钦县| 南陵县| 甘德县|