ThinkPHP 自動驗證
ThinkPHP 內建了資料對象的自動驗證功能來完成模型的商務規則驗證。自動驗證是基於資料對象的,而大多情況下資料對象是基於 $_POST表單 (不是絕對的)建立的。
基本的自動驗證功能包括:必須欄位、email郵箱格式、唯一性、URL地址、數字、兩個欄位是否相同、是否等於某個值等。
要使用系統的自動驗證功能,只需要在對應的 Model類 裡面定義 $_validate 屬性(由多個驗證因子組成的數組),文法如下:
protected $_validate = array( array(驗證欄位,驗證規則,錯誤提示[,驗證條件][,附加規則][,驗證時間])};
ThinkPHP自動驗證格式說明:
| 驗證因子 |
說明 |
| 驗證欄位 |
必須。需要驗證的表單欄位名稱,這個欄位不一定是資料庫欄位,也可以是表單的一些輔助欄位,例如驗證碼等。 |
| 驗證規則 |
必須。要進行驗證的規則,需要聯合附加規則一起使用。 |
| 錯誤提示 |
必須。當驗證不通過時的提示資訊。 |
| 驗證條件 |
可選。包括:
- Model::EXISTS_TO_VAILIDATE 或者 0 :存在欄位就驗證(預設)
- Model::MUST_TO_VALIDATE 或者 1 :必須驗證
- Model::VALUE_TO_VAILIDATE 或者 2 :值不為空白的時候驗證
|
| 附加規則 |
可選。配合驗證規則使用,包括:
- regex:使用正則進行驗證,表示前面定義的驗證規則是一個Regex(預設)
- unique:驗證唯一性,系統會根據欄位目前的值查詢資料庫來判斷是否存在相同的值
- confirm:驗證表單中的兩個欄位是否相同,前面定義的驗證規則是一個欄位名
- equal:驗證是否等於某個值,該值由前面的驗證規則定義
- in:驗證是否在某個範圍內,前面定義的驗證規則必須是一個數組
- function:使用函數驗證,表示前面定義的驗證規則是一個函數名
- callback:使用方法驗證,前面定義的驗證規則是當前 Model 類的一個方法
|
| 驗證時間 |
可選。包括:
- Model:: MODEL_INSERT 或者 1 :新增資料時候驗證
- Model:: MODEL_UPDATE 或者 2 :編輯資料時候驗證
- Model:: MODEL_BOTH 或者 3 :全部情況下驗證(預設)
|
自動驗證例子
下面的例子驗證文章標題必須填寫且檢測標題是否已存在:
class ArticleModel extends Model{ protected $_validate = array( array('title','require','標題不可為空!'), array('title','','標題已經存在!',0,'unique',1), };}
在操作中,當使用 create 方法建立資料對象時會自動進行資料驗證操作(當 POST 提交表單處理時):
$Article = D("Article");if (!$Article->create()){ // 如果建立失敗,表示驗證沒有通過(註:可能原因之一)輸出錯誤提示資訊 exit($Article->getError());}else{ // 驗證通過,繼續下一步流程如將資料寫入資料表}
系統內建了一些常用正則驗證的規則,包括:require(必須)、email(郵箱格式)、url(URL地址)、currency(貨幣)、number(數字)、qq(QQ號碼)、english(英文字元),可以直接使用。
出於使用者體驗考慮,$Article->getError() 返回的錯誤提示資訊,一般以 Ajax 方式返回,詳細參見《ThinkPHP Ajax》。
定義自己的驗證規則
當內建的這些驗證規則無法滿足驗證要求是,可以定義自己的驗證規則,如要求出生年月以 2000-1-1 格式輸入時:
array('birthday','/^d{4}-d{1,2}-d{1,2}$/','出生年月格式錯誤!'),
可見,只需幾行簡單的代碼,就實現了各種不同方式的表單驗證,靈活使用 ThinkPHP 自動驗證,可以讓開發過程事半功倍。更多自動驗證列子,參見本節內容之《ThinkPHP 自動驗證執行個體》。