【小(xiǎo)編推薦】ThinkPHP3.2——自(zì)動驗證

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)兩種方式:

  1. 靜(jìng)态方式:在模型類裡(lǐ)面通(tōng)過$_valida​≈¥te屬性定義驗證規則。
  2. 動态方式:使用(yòng)模型類的(de)validate方法動态創§ 建自(zì)動驗證規則。

無論是(shì)什(shén)麽方式,驗證規則§¶§的(de)定義是(shì)統一(yī)的(de)規則,定義格式為(wèi)♣∞↕:

  1. array(
  2. array(驗證字段1,驗證規則,錯(cuò)誤提示,[驗證條件& (jiàn),附加規則,驗證時(shí)間(jiān)]),
  3. array(驗證字段2,驗證規則,錯(cuò)誤提示,[驗證條件(jiàn),附加規則,驗證時Ω (shí)間(jiān)]),
  4. ......
  5. );

說(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)提示信息定義

驗證條件(jiàn) (可(kě)選)

包含下(xià)面幾種情況:

附加規則 (可(kě)選)

配合驗證規則使用(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)
驗證時(shí)間(jiān)(可(kě)選™¶)

這(zhè)裡(lǐ)的(de)驗證時(shí)間(jiānφ÷•↑)需要(yào)注意,并非隻有(yǒu)這(zhè)三種情況,你(n®♦>ǐ)可(kě)以根據業(yè)務需要(yào)增加其他(tā¶☆)的(de)驗證時(shí)間(jiān)。

靜(jìng)态定義

在模型類裡(lǐ)面預先定義好(hǎo)該模型的(de)自(zì‍ φ✔)動驗證規則,我們稱為(wèi)靜(jìng)态定義。

舉例說(shuō)明(míng),我們在模型類裡(lǐ®©≠£)面定義了(le)$_validate屬性如(rú)下(xià):

  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $_validate = array(
  5. array('verify','require','驗證碼必須!'), //默認情況下(xià)用(yòng)正則進行(xíng)→>γ驗證
  6. array('name','','帳号名稱已經存在!',0,'unique',1), // 在新增的(de)時(shí)候驗證nam Ωe字段是(shì)否唯一(yī)
  7. array('value',array(1,2,3),'值的(de)範圍不(bù)正确!',2,'in'), // 當值不(bù)為(wèi)空(kōng)的(de)時$​>(shí)候判斷是(shì)否在一(yī)個γ∑÷(gè)範圍內(nèi)
  8. array('repassword','password','确認密碼不(bù)正确',0,'confirm'), // 驗證确認密碼是(shì)否和(hé)密碼一(€≤yī)緻
  9. array('password','checkPwd','密碼格式不(bù)正确',0,'function'), // 自(zì)定義函數(shù)驗證密碼格式
  10. );
  11. }

定義好(hǎo)驗證規則後,就(jiù)可(kě)以在使用(yβ♥≤€òng)create方法創建數(shù)據對(duì)象∞​≈的(de)時(shí)候自(zì)動調用(yòngα<):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. if (!$User->create()){
  3. // 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tōαπ♥ng)過 輸出錯(cuò)誤提示信息
  4. exit($User->getError());
  5. }else{
  6. // 驗證通(tōng)過 可(kě)以進行(x↕↕íng)其他(tā)數(shù)據操作(zuò)
  7. }

在進行(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à):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. $data = getData(); // 通(tōng)過getData方法獲取∞‌≈數(shù)據源的(de)(數(shù)組)數(shù)據
  3. if (!$User->create($data)){
  4. // 對(duì)data數(shù)據進行(xín>✘®★g)驗證
  5. exit($User->getError());
  6. }else{
  7. // 驗證通(tōng)過 可(kě)以進行(xíng)其他(tā)‌♥Ω數(shù)據操作(zuò)
  8. }

一(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ú):

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. if (!$User->create($_POST,1)){ // 指定新增數(shù)據
  3. // 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tōng)過 輸♥≥$出錯(cuò)誤提示信息
  4. exit($User->getError());
  5. }else{
  6. // 驗證通(tōng)過 可(kě)以進行‍α(xíng)其他(tā)數(shù)據操作(z↓♠φ∏uò)
  7. }

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à):

  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $_validate = array(
  5. array('verify','require','驗證碼必須!'), // 都(dōu)有(yǒu)時(shí)間(jiān)都(dōu)驗證₽₩πσ
  6. array('name','checkName','帳号錯(cuò)誤!',1,'function',4), // 隻在登錄時(shí)候驗證
  7. array('password','checkPwd','密碼錯(cuò)誤!',1,'function',4), // 隻在登錄時(shí)候驗證
  8. );
  9. }

那(nà)麽,我們就(jiù)可(kě)以在登錄的(de)時(shí)候&γ∑∞使用(yòng)

  1. $User = D("User"); // 實例化(huà)User對(duì)象
  2. if (!$User->create($_POST,4)){ // 登錄驗證數(shù)據
  3. // 驗證沒有(yǒu)通(tōng)過 輸出錯(cuò)誤提示信息♠α↑
  4. exit($User->getError());
  5. }else{
  6. // 驗證通(tōng)過 執行(xíng)登錄操作(zuò)
  7. }

動态驗證

如(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):

  1. $rules = array(
  2. array('verify','require','驗證碼必須!'), //默認情況下(xià)用(yòng)正則進行(xíng)驗證≤↑"
  3. array('name','','帳号名稱已經存在!',0,'unique',1), // 在新增的(de)時(shí)候驗證na≥¶me字段是(shì)否唯一(yī)
  4. array('value',array(1,2,3),'值的(de)範圍不(bù)正确!',2,'in'), // 當值不(bù)為(wèi)空(kōng)的(de)時(shí)候判斷是ε<(shì)否在一(yī)個(gè)範圍內(nèi)
  5. array('repassword','password','确認密碼不(bù)正确',0,'confirm'), // 驗證确認密碼是(shì)否和(hé)密碼一(yī)緻
  6. array('password','checkPwd','密碼格式不(bù)正确',0,'function'), // 自(zì)定義函數(shù)驗證密碼格式
  7. );
  8.  
  9. $User = M("User"); // 實例化(huà)User對(duì)象
  10. if (!$User->validate($rules)->create()){
  11. // 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tōng)過 輸出錯(σ£γ​cuò)誤提示信息
  12. exit($User->getError());
  13. }else{
  14. // 驗證通(tōng)過 可(kě)以≠ β♦進行(xíng)其他(tā)數(shù)♥÷¥據操作(zuò)
  15. }

動态驗證不(bù)依賴模型類的(de)定義,所以通(tōng)≠↓'♠常用(yòng)M函數(shù)實例化(huà)模型就(jiù)可(kě)以₽★€

錯(cuò)誤信息多(duō)語言支持

如(rú)果你(nǐ)希望支持多(duō)語言的(de)錯( πcuò)誤信息提示,那(nà)麽可(kě)以在驗證↑λφ 規則裡(lǐ)面如(rú)下(xià)定義:

  1. protected $_validate = array(
  2. array('verify','require','{%VERIFY_CODE_MUST}'),
  3. array('name','','{%ACCOUNT_EXISTS}',0,'unique',1),
  4. );

其中VERIFY_CODE_MUST和(hé)ACCOUNT_EXISTS是(shì)我們在語言包裡(lǐ)面定義的(de)多(≈Ωduō)語言變量。

如(rú)果是(shì)采用(yòng)動态驗證方式,則比較簡單,直接在定義驗 <證規則的(de)時(shí)候使用(yòng)L方法即可(kě)α®∑,例如(rú):

  1. $rules = array(
  2. array('verify','require',L('VERIFY_CODE_MUST')),
  3. array('name','',L('ACCOUNT_EXISTS'),0,'unique',1),
  4. );

批量驗證

系統支持數(shù)據的(de)批量驗證功能(né☆≤ng),隻需要(yào)在模型類裡(lǐ)面設置patchV↕±ε±alidate屬性為(wèi)true( 默認為(wèi)falsε☆≠e),

  1. protected $patchValidate = true;

設置批處理(lǐ)驗證後,getError() 方法返回的(de)錯(cuò)誤信息是(shì)一(yī)±©£✘個(gè)數(shù)組,返回格式是(s®Ω♦hì):

  1. array("字段名1"=>"錯(cuò)誤提示1","字段名2"=>"錯(cuò)誤提示2"φ♦φ∏;... )

前端可(kě)以根據需要(yào)需要(yào)自(zì) ★行(xíng)處理(lǐ),例如(rú)轉換成jso≥®εn格式返回:

  1. $User = D("User"); // 實例化(huà)User對(duì)象₹•>☆
  2. if (!$User->create()){
  3. // 如(rú)果創建失敗 表示驗證沒有(yǒu)通(tεφōng)過 輸出錯(cuò)誤提示信息
  4. $this->ajaxReturn($User->getError());
  5. }else{
  6. // 驗證通(tōng)過 可(kě)以進行(xí  $ng)其他(tā)數(shù)據操作(zuò)
  7. }