TP框架中的自動驗證功能 validate

2021-07-04 05:26:05 字數 3194 閱讀 8435

thinkphp 中$_validate 關鍵字是在模型中定義的自動驗證資料的功能。驗證的規則可以是進行資料型別、業務規則、安全判斷等方面的驗證操作。

資料驗證有兩種方式:

靜態方式:在模型類裡面通過$_validate屬性定義驗證規則。

動態方式:使用模型類的validate方法動態建立自動驗證規則。 

無論是什麼方式,驗證規則的定義是統一的規則,定義格式為:

array(

array(驗證欄位1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),

array(驗證欄位2,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),

......);

說明引數一:驗證字段 (必須)

需要驗證的表單字段名稱,這個欄位不一定是資料庫字段,也可以是表單的一些輔助字段,例如確認密碼和驗證碼等等。有個別驗證規則和字段無關的情況下,驗證欄位是可以隨意設定的,例如expire有效期規則是和表單字段無關的。如果定義了字段對映的話,這裡的驗證欄位名稱應該是實際的資料表字段而不是表單字段。

引數二:驗證規則 (必須)

要進行驗證的規則,需要結合附加規則,如果在使用正則驗證的附加規則情況下,系統還內建了一些常用正則驗證的規則,可以直接作為驗證規則使用,包括:require 字段必須、email 郵箱、url url位址、currency 貨幣、number 數字。

引數三:提示資訊 (必須)

用於驗證失敗後的提示資訊定義

引數四:驗證條件 (可選)

包含下面幾種情況:

引數五:附加規則 (可選) 配合引數二驗證規則使用,包括下面一些規則:

規則說明

regex

正則驗證,定義的驗證規則是乙個正規表示式(預設)

function

函式驗證,定義的驗證規則是乙個函式名

callback

方法驗證,定義的驗證規則是當前模型類的乙個方法

confirm

驗證表單中的兩個字段是否相同,定義的驗證規則是乙個欄位名

equal

驗證是否等於某個值,該值由前面的驗證規則定義

notequal

驗證是否不等於某個值,該值由前面的驗證規則定義(3.1.2版本新增)

in驗證是否在某個範圍內,定義的驗證規則可以是乙個陣列或者逗號分割的字串

notin

驗證是否不在某個範圍內,定義的驗證規則可以是乙個陣列或者逗號分割的字串(3.1.2版本新增)

length

驗證長度,定義的驗證規則可以是乙個數字(表示固定長度)或者數字範圍(例如3,12 表示長度從3到12的範圍)

between

驗證範圍,定義的驗證規則表示範圍,可以使用字串或者陣列,例如1,31或者array(1,31)

notbetween

驗證不在某個範圍,定義的驗證規則表示範圍,可以使用字串或者陣列(3.1.2版本新增)

expire

驗證是否在有效期,定義的驗證規則表示時間範圍,可以到時間,例如可以使用 2012-1-15,2013-1-15 表示當前提交有效期在2012-1-15到2013-1-15之間,也可以使用時間戳定義

ip_allow

驗證ip是否允許,定義的驗證規則表示允許的ip位址列表,用逗號分隔,例如201.12.2.5,201.12.2.6

ip_deny

驗證ip是否禁止,定義的驗證規則表示禁止的ip位址列表,用逗號分隔,例如201.12.2.5,201.12.2.6

unique

驗證是否唯一,系統會根據字段目前的值查詢資料庫來判斷是否存在相同的值,當表單資料中包含主鍵欄位時unique不可用於判斷主鍵字段本身

引數六:驗證時間(可選)

這裡的驗證時間需要注意,並非只有這三種情況,你可以根據業務需要增加其他的驗證時間,例如:

其中,對create資料的設定是這樣  :$m -> create($_post,4);

在模型類裡面預先定義好該模型的自動驗證規則,我們稱為靜態定義。

舉例說明,我們在模型類裡面定義了$_validate屬性如下:

namespace home\model;

use think\model;

class usermodel extends model

定義好驗證規則後,就可以在使用create方法建立資料物件的時候自動呼叫:

$user = d("user"); // 例項化user物件

if (!$user->create())else

在進行自動驗證的時候,系統會對定義好的驗證規則進行依次驗證。如果某一條驗證規則沒有通過,則會報錯,geterror方法返回的錯誤資訊(字串)就是對應欄位的驗證規則裡面的錯誤提示資訊。

靜態定義方式因為必須定義模型類,所以只能用d函式例項化模型。

$user = d("user"); // 例項化user物件

$data = getdata(); // 通過getdata方法獲取資料源的(陣列)資料

if (!$user->create($data))else

$user = d("user"); // 例項化user物件

if (!$user->create($_post,1))else

create方法的第二個引數就用於指定自動驗證規則中的驗證時間,也就是說create方法的自動驗證只會驗證符合驗證時間的驗證規則。

我們在上面提到這裡的驗證時間並非只有這幾種情況,你可以根據業務需要增加其他的驗證時間,例如,你可以給登入操作專門指定驗證時間為4。我們定義驗證規則如下:

tp框架中的命名空間

首先是我對命名空間的理解,命名空間相當於乙個空間,拿班級做比方,不同的班級就是不同的空間,每個班級都有叫小明的同學,但是不會因為有兩個小明而產生矛盾。這就是命名空間的作用 同乙個請求裡面,相同函式,類名,常亮不能出現多次 function chat echo demo changliang 訪問元素...

tp框架中的根命名空間

根命名空間是乙個關鍵的概念,例如 think cache driver file類為例,think就是乙個根命名空間,其對應的初始命名空間目錄就是系統的類庫目錄 thinkphp library think 我們可以簡單的理解乙個根命名空間對應了乙個類庫包 分析 載入loader類 require ...

TP框架中的page分頁實現

今天介紹一下如何在tp框架中使用分頁功能 tp3.2 開啟分頁類,修改命名空間 2.第二步,找到需要分頁功能的控制器中相對應的操作方法 3.在顯示頁面遍歷顯示出來 table foreach name art item v tr td td td td tr foreach table 4.正確顯示...