
2014-06-26 |&nb ©₽sp; 發布者:梁國(guó)芳 &nb♣¶'sp; | 查看(∑'↕kàn):3320次
Thinkphp自(zì)動驗證是(shì)ThinkPHP模型層提供的(de)÷π≈一(yī)種數(shù)據驗證方法,可(kě)以在∏×使用(yòng)create創建數(shù)據對(duì)象的(de)時(shβ↓δí)候自(zì)動進行(xíng)數(shù)據驗證。
數(shù)據驗證可(kě)以進行(xíng)數(shù)據類型、業(yè)務&>γ規則、安全判斷等方面的(de)驗證操作(zuò)。
數(shù)據驗證有(yǒu)兩種方式:
無論是(shì)什(shén)麽方式,驗證規則§¶§的(de)定義是(shì)統一(yī)的(de)規則,定義格式為(wèi)♣∞↕:
array(array(驗證字段1,驗證規則,錯(cuò)誤提示,[驗證條件& (jiàn),附加規則,驗證時(shí)間(jiān)]),array(驗證字段2,驗證規則,錯(cuò)誤提示,[驗證條件(jiàn),附加規則,驗證時Ω (shí)間(jiān)]),......);
說(shuō)明(míng)
需要(yào)驗證的(de)表單字段名稱,這(zhè)個(gè) <φ字段不(bù)一(yī)定是(shì)數(shù)≤ε據庫字段,也(yě)可(kě)以是(shì)表單的(de )一(yī)些(xiē)輔助字段,例如(rú)确認密碼和(hé)驗證碼等×∑↓♠等。有(yǒu)個(gè)别驗證規則和(hé§↔)字段無關的(de)情況 下(xià),驗證字段是(shì)可(kě)以随意設$®置的(de),例如(rú)expire有≠<(yǒu)效期規則是(shì)和(hé)表單字段無關的(de)。如(rú)果♠σ 定義了(le)字段映射的(de)話(huà),這(zhè)裡(lǐ♦✘)的(de)驗證字段名稱應該是(shì)實際的(de)數(shù)®£據表字段而不(bù) 是(shì)表單字段。
要(yào)進行(xíng)驗證的(de)規則,ε★需要(yào)結合附加規則,如(rú)果在使用(yòng)正則驗證的(de®≈×★)附加規則情況下(xià),系統還(hái)內(≤¶© nèi)置了(le)一(yī)些(xiē)常用(y♣òng)正則驗證的(de)規則,可(kěε ₹)以直接作(zuò)為(wèi)驗證規則使用(yòng),包括:require$< 字段必須、email 郵箱、url URL地(dì)址、c∑↔★urrency 貨币、number 數(shù)字。
用(yòng)于驗證失敗後的(de)提示信息定義
包含下(xià)面幾種情況:
配合驗證規則使用(yòng),包括下(xià)♦α≈✔面一(yī)些(xiē)規則:
| 規則 | 說(shuō)明(míng) |
|---|---|
| regex | 正則驗證,定義的(de)驗證規則是(shì)一(yī)個(gèΩ)正則表達式(默認) |
| function | 函數(shù)驗證,定義的(de)驗證規則是(shì)一(yī)個( βgè)函數(shù)名 |
| callback | 方法驗證,定義的(de)驗證規則是(shì)↑↓當前模型類的(de)一(yī)個(gè)方法Ω•σ |
| confirm | 驗證表單中的(de)兩個(gè)字段是(shì)否相(xiàng)同,定義β 的(de)驗證規則是(shì)一(yī)個(gè)字段名 |
| equal | 驗證是(shì)否等于某個(gè)值,該值由前面的(de)驗證規則£定義 |
| notequal | 驗證是(shì)否不(bù)等于某個(gè)值,該值由前面的(de)驗證規則✘∑定義(3.1.2版本新增) |
| in | 驗證是(shì)否在某個(gè)範圍內(nè✔♥∑i),定義的(de)驗證規則可(kě)以是(shì)一(yī↕"Ω)個(gè)數(shù)組或者逗号分(fēn)割的(de)字符串 |
| notin | 驗證是(shì)否不(bù)在某個(gè)範圍內(n≥♦èi),定義的(de)驗證規則可(kě)以是(shì)≥< 一(yī)個(gè)數(shù)組或者逗号分(fēn)割的(de)字符串(♥¥≥3.1.2版本新增) |
| length | 驗證長(cháng)度,定義的(de)驗證規則可(kěδ∑)以是(shì)一(yī)個(gè)數(shù)字(表示固定長(chán"$g)度)或者數(shù)字範圍(例如(rú)3,12 表示長(cháβ ↓σng)度從(cóng)3到(dào)12的(de)範圍) |
| between | 驗證範圍,定義的(de)驗證規則表示範圍,可(kě)以使用♣↔±☆(yòng)字符串或者數(shù)組,例如(rú)1,31或者array(1>∑∞,31) |
| notbetween | 驗證不(bù)在某個(gè)範圍,定義的(de)驗證規則表示範圍,可(kě)<σ£以使用(yòng)字符串或者數(shù)組(3.1©•∏ .2版本新增) |
| expire | 驗證是(shì)否在有(yǒu)效期,定義的(deσ¥₹)驗證規則表示時(shí)間(jiān)範圍,可(kěδ≠)以到(dào)時(shí)間(jiān),例如(rú)>δ÷可(kě)以使用(yòng) 2012-1-15,20≥≥13-1-15 表示當前提交有(yǒu)效期在2012-1-15到(dàπαo)2013-1-15之間(jiān),也(yě)可(≤>kě)以使用(yòng)時(shí)間(jiān)戳定義 |
| ip_allow | 驗證IP是(shì)否允許,定義的(de)驗證規則表示≠ ↓×允許的(de)IP地(dì)址列表,用(yòng)逗号分(f••¶ ēn)隔,例如(rú)201.12.2.5,201.12×ε.2.6 |
| ip_deny | 驗證IP是(shì)否禁止,定義的(de)驗證規則表示↓α₹禁止的(de)ip地(dì)址列表,用(yòng)逗号分(fēn)隔,例 ™♥如(rú)201.12.2.5,201.1<<•"2.2.6 |
| unique | 驗證是(shì)否唯一(yī),系統會(huì)根據字段目前♠★φ©的(de)值查詢數(shù)據庫來(lái)判斷是(s•₩"hì)否存在相(xiàng)同的(de)值,當表↕αα單數(shù)據中包含主鍵字段時(shí"<©)unique不(bù)可(kě)用(yòng)于判斷 ₹主鍵字段本身(shēn) |
這(zhè)裡(lǐ)的(de)驗證時(shí)間(jiānφ÷•↑)需要(yào)注意,并非隻有(yǒu)這(zhè)三種情況,你(n®♦>ǐ)可(kě)以根據業(yè)務需要(yào)增加其他(tā¶☆)的(de)驗證時(shí)間(jiān)。
在模型類裡(lǐ)面預先定義好(hǎo)該模型的(de)自(zì φ✔)動驗證規則,我們稱為(wèi)靜(jìng)态定義。
舉例說(shuō)明(míng),我們在模型類裡(lǐ®©≠£)面定義了(le)$_validate屬性如(rú)下(xià):
namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_validate = array(array('verify','require','驗證碼必須!'), //默認情況下(xià)用(yòng)正則進行(xíng)→>γ驗證array('name','','帳号名稱已經存在!',0,'unique',1), // 在新增的(de)時(shí)候驗證nam Ωe字段是(shì)否唯一(yī)array('value',array(1,2,3),'值的(de)範圍不(bù)正确!',2,'in'), // 當值不(bù)為(wèi)空(kōng)的(de)時$>(shí)候判斷是(shì)否在一(yī)個γ∑÷(gè)範圍內(nèi)array('repassword','password','确認密碼不(bù)正确',0,'confirm'), // 驗證确認密碼是(shì)否和(hé)密碼一(€≤yī)緻array('password','checkPwd','密碼格式不(bù)正确',0,'function'), // 自(zì)定義函數(shù)驗證密碼格式);}
定義好(hǎo)驗證規則後,就(jiù)可(kě)以在使用(yβ♥≤€òng)create方法創建數(shù)據對(duì)象∞≈的(de)時(shí)候自(zì)動調用(yòngα<):
$User = D("User"); // 實例化(huà)User對(duì)象if (!$User->create()){// 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tōαπ♥ng)過 輸出錯(cuò)誤提示信息exit($User->getError());}else{// 驗證通(tōng)過 可(kě)以進行(x↕↕íng)其他(tā)數(shù)據操作(zuò)}
在進行(xíng)自(zì)動驗證的(de)時β(shí)候,系統會(huì)對(duì'≈✔☆)定義好(hǎo)的(de)驗證規則進行(xíng)依次驗證。如(rú)果某一±'β(yī)條驗證規則沒有(yǒu)通(tōng)過,則會(huì)報(b'≈∏ào)錯(cuò),getError方法返回的(de)錯(cuò)誤信息(←Ω∞字符串)就(jiù)是(shì)對(duì)應字段的(de)驗證規則裡(lǐ©&©)面的(de)錯(cuò)誤提示信息。
靜(jìng)态定義方式因為(wèi)必須定義模型類,所以隻能(n$≥±éng)用(yòng)D函數(shù)實例¥£σ≠化(huà)模型
默認情況下(xià),create方法是(sh'™♥₩ì)對(duì)表單提交的(de)POST數(shù)據進行•¥>(xíng)自(zì)動驗證,如(rú)果你(nǐ)的(de)數(sh₽¶™ù)據來(lái)源不(bù)是(shì)表單pos≈ε<t,仍然也(yě)可(kě)以進行(xíng)自(zì)動驗證,方δ•法改進如(rú)下(xià):
$User = D("User"); // 實例化(huà)User對(duì)象$data = getData(); // 通(tōng)過getData方法獲取∞≈數(shù)據源的(de)(數(shù)組)數(shù)據if (!$User->create($data)){// 對(duì)data數(shù)據進行(xín>✘®★g)驗證exit($User->getError());}else{// 驗證通(tōng)過 可(kě)以進行(xíng)其他(tā)♥Ω數(shù)據操作(zuò)}
一(yī)般情況下(xià),create方法會(huì)自(zì)®♠ "動判斷當前是(shì)新增數(shù)據還(hái)是§φ(shì)編輯數(shù)據(主要(yào)是(shì)通(tōng≠λ)過表單的(de)隐藏數(shù)據添加主鍵信息),你(nǐ)也♦€∑₩(yě)可(kě)以明(míng)确指定當前創建的(de)數(shù)×↓據對(duì)象是(shì)新增還(hái)是(≈≥shì)編輯,例如(rú):
$User = D("User"); // 實例化(huà)User對(duì)象if (!$User->create($_POST,1)){ // 指定新增數(shù)據// 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tōng)過 輸♥≥$出錯(cuò)誤提示信息exit($User->getError());}else{// 驗證通(tōng)過 可(kě)以進行α(xíng)其他(tā)數(shù)據操作(z↓♠φ∏uò)}
create方法的(de)第二個(gè)參數(shù)就(ji•<♠ù)用(yòng)于指定自(zì)動驗證規則中的(de)驗證時(shí)δ¶間(jiān),也(yě)就(jiù)是™↑£π(shì)說(shuō)create方法的(de)自←♠(zì)動驗證隻會(huì)驗證符合驗證時(shí)間(jiān×δ♠)的(de)驗證規則。
我們在上(shàng)面提到(dào)這(zhè)裡(lǐ)的(de)驗證時(®shí)間(jiān)并非隻有(yǒu)這(zhè)幾種♣±情況,你(nǐ)可(kě)以根據業(yè)β≠↓務需要(yào)增加其他(tā)的(de)驗證時(shí)間(jδ ←'iān),例如(rú),你(nǐ)可(kě)以給登錄"π操作(zuò)專門(mén)指定驗證時(shí)間(jiān)為(wèi)↑ 4。我們定義驗證規則如(rú)下(xià):
namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_validate = array(array('verify','require','驗證碼必須!'), // 都(dōu)有(yǒu)時(shí)間(jiān)都(dōu)驗證₽₩πσarray('name','checkName','帳号錯(cuò)誤!',1,'function',4), // 隻在登錄時(shí)候驗證array('password','checkPwd','密碼錯(cuò)誤!',1,'function',4), // 隻在登錄時(shí)候驗證);}
那(nà)麽,我們就(jiù)可(kě)以在登錄的(de)時(shí)候&γ∑∞使用(yòng)
$User = D("User"); // 實例化(huà)User對(duì)象if (!$User->create($_POST,4)){ // 登錄驗證數(shù)據// 驗證沒有(yǒu)通(tōng)過 輸出錯(cuò)誤提示信息♠α↑exit($User->getError());}else{// 驗證通(tōng)過 執行(xíng)登錄操作(zuò)}
如(rú)果采用(yòng)動态驗證的(de)方式,就(jiù)比較靈活♣>φ,可(kě)以根據不(bù)同的(de)需要(yào★←),在操作(zuò)同一(yī)個(gè)模型的(de)時(s≠>hí)候使用(yòng)不(bù)同的(de)驗證規則σ ,例如(rú)上(shàng)面的(de)靜(jìng)态驗證方式可(kě♦δ↔)以改為(wèi):
$rules = array(array('verify','require','驗證碼必須!'), //默認情況下(xià)用(yòng)正則進行(xíng)驗證≤↑"array('name','','帳号名稱已經存在!',0,'unique',1), // 在新增的(de)時(shí)候驗證na≥¶me字段是(shì)否唯一(yī)array('value',array(1,2,3),'值的(de)範圍不(bù)正确!',2,'in'), // 當值不(bù)為(wèi)空(kōng)的(de)時(shí)候判斷是ε<(shì)否在一(yī)個(gè)範圍內(nèi)array('repassword','password','确認密碼不(bù)正确',0,'confirm'), // 驗證确認密碼是(shì)否和(hé)密碼一(yī)緻array('password','checkPwd','密碼格式不(bù)正确',0,'function'), // 自(zì)定義函數(shù)驗證密碼格式);$User = M("User"); // 實例化(huà)User對(duì)象if (!$User->validate($rules)->create()){// 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tōng)過 輸出錯(σ£γcuò)誤提示信息exit($User->getError());}else{// 驗證通(tōng)過 可(kě)以≠ β♦進行(xíng)其他(tā)數(shù)♥÷¥據操作(zuò)}
動态驗證不(bù)依賴模型類的(de)定義,所以通(tōng)≠↓'♠常用(yòng)M函數(shù)實例化(huà)模型就(jiù)可(kě)以₽★€
如(rú)果你(nǐ)希望支持多(duō)語言的(de)錯( πcuò)誤信息提示,那(nà)麽可(kě)以在驗證↑λφ 規則裡(lǐ)面如(rú)下(xià)定義:
protected $_validate = array(array('verify','require','{%VERIFY_CODE_MUST}'),array('name','','{%ACCOUNT_EXISTS}',0,'unique',1),);
其中VERIFY_CODE_MUST和(hé)ACCOUNT_EXISTS是(shì)我們在語言包裡(lǐ)面定義的(de)多(≈Ωduō)語言變量。
如(rú)果是(shì)采用(yòng)動态驗證方式,則比較簡單,直接在定義驗 <證規則的(de)時(shí)候使用(yòng)L方法即可(kě)α®∑,例如(rú):
$rules = array(array('verify','require',L('VERIFY_CODE_MUST')),array('name','',L('ACCOUNT_EXISTS'),0,'unique',1),);
系統支持數(shù)據的(de)批量驗證功能(né☆≤ng),隻需要(yào)在模型類裡(lǐ)面設置patchV↕±ε±alidate屬性為(wèi)true( 默認為(wèi)falsε☆≠e),
protected $patchValidate = true;
設置批處理(lǐ)驗證後,getError() 方法返回的(de)錯(cuò)誤信息是(shì)一(yī)±©£✘個(gè)數(shù)組,返回格式是(s®Ω♦hì):
array("字段名1"=>"錯(cuò)誤提示1","字段名2"=>"錯(cuò)誤提示2"φ♦φ∏;... )
前端可(kě)以根據需要(yào)需要(yào)自(zì) ★行(xíng)處理(lǐ),例如(rú)轉換成jso≥®εn格式返回:
$User = D("User"); // 實例化(huà)User對(duì)象₹•>☆if (!$User->create()){// 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tεφōng)過 輸出錯(cuò)誤提示信息$this->ajaxReturn($User->getError());}else{// 驗證通(tōng)過 可(kě)以進行(xí $ng)其他(tā)數(shù)據操作(zuò)}
