標籤:
一、概述
ThinkPHP的官方叫法是自動驗證、自動完成和欄位對應,由於這三項功能都是使用create()方法時自動實現的,所以個人稱之為三大自動,即自動驗證、自動完成(自動填滿)和自動對應
二、自動驗證
類型檢查只是針對資料庫層級的驗證,所以系統還內建了資料對象的自動驗證功能來完成模型的商務規則驗證,而大多數情況下面,資料對象是由表單提交的$_POST資料建立。需要使用系統的自動驗證功能,只需要在Model類裡面定義$_validate屬性,是由多個驗證因子組成的數組,一個驗證因子就是一個一維數組,也就是說在自訂Model類中定義的$_validate屬性是一個二維數組
強調一下,自動驗證針對的是表單的name屬性,而不是資料對象,也不是實際的資料表欄位。資料對象中相應的屬性和資料表相應欄位是一致的!
所謂自動驗證,就是在根據使用者的輸入(通常是POST過來的表單)建立了資料對象之前,自動對傳過來的資料進行驗證(比如說使用者名稱長度、重複密碼與密碼是否一致、郵箱格式是否合法等等),以擷取到合法的資料。通常這些操作需要手動(在控制器中)寫代碼進行處理,但是ThinkPHP為我們提供了一種更好的解決方案,即在create()方法中自動實現!
1、驗證因子格式
array(驗證欄位,驗證規則,錯誤提示,驗證條件,附加規則,驗證時間)
·驗證欄位(必須)
如果沒做自動對應,那麼驗證欄位就必須是表單的name屬性值;如果做了自動對應,那麼驗證欄位就是映射之後的值!特彆強調一點,自動對應成哪個值(即便是與資料表欄位名不相同)都並不會影響自動驗證,但是會影響資料對象的建立(這裡影響資料對象的建立並不是說建立失敗而是指自動對應的那個與資料表欄位不相同的值並不會壓入到資料對象中,即資料對象不完整),所以一般來說,自動對應成的那個值就是資料表實際欄位名,以便於資料對象的建立!
驗證欄位並不是必須得存到資料表中的,也可以是表單的一些輔助,如確認密碼、驗證碼等等
·驗證規則(必須)
要進行驗證的規則,得結合附加規則
·錯誤提示(必須)
用於驗證失敗後的提示資訊
·驗證條件(可選)
Model::EXISTS_TO_VAILIDATE或者0,表示存在就驗證(預設)。即如果該欄位存在就驗證
Model::MUST_TO_VALIDATE或者1,必須驗證。即不管欄位是否存在,都得驗證
Model::VALUE_TO_VAILIDATE或者2,值不為空白的時候驗證。即該欄位傳遞過來的資料不為空白就驗證
·附加規則(可選)
配合驗證規則使用
regex表示使用正則進行驗證,那麼前面的驗證規則就必須是一個Regex(預設)
系統內建了一些正則規則,可直接使用,比如require(不可為空)、email(郵箱)、url(URL地址)、 currency(貨幣)、number(數字)
同時也可以自訂Regex或Google
function表示使用函數進行驗證,那麼前面的驗證規則就必須是一個函數
callback表示使用方法進行驗證,那麼前面的驗證規則就必須是當前模型類的一個方法
confirm表示驗證兩個欄位值是否相同,那麼那麼前面的驗證規則就必須是一個欄位
equal表示驗證是否等於某個值,那麼前面的驗證規則就必須是一個值
in表示驗證是否在某個範圍內,那麼前面的驗證規則就必須是一個數組
unique表示驗證是否唯一,系統會根據傳遞過來的值去查詢資料庫,如果存在,則報錯並終止
·驗證時間(可選)
Model:: MODEL_INSERT 或者1,表示新增資料時候驗證
Model:: MODEL_UPDATE 或者2,表示編輯資料時候驗證
Model:: MODEL_BOTH 或者3,表示全部情況下驗證(預設)
2、所有的驗證因子驗證成功才算驗證成功,且驗證成功之後才建立資料對象(建立成功返回一個數組),否則不建立(建立失敗返回false)!
3、錯誤提示是通過$Model->getError()方法擷取到的
4、一般來說,一個表的驗證規則是固定的,但是有些特殊情況下也需要改變驗證規則,但是出於安全性考慮,$_validate屬性通常定義為private或protected的,無法直接通過對象訪問。鑒於此,ThinkPHP設計了一個public的setProperty()方法可以修改對象屬性
顯然,如果$_validate屬性是public的話,可以直接修改,但是一般是不會定義成public的!
如下是ThinkPHP源碼的Model類中的setProperty()方法的定義,其中property_exists()函數(原生php函數)檢測一個對象或類是否有某個屬性
三、自動完成(自動填滿)
所謂自動完成(自動填滿),就是在根據使用者的輸入(通常是POST過來的表單)建立了資料對象之後,自動再給該資料對象添加其它的屬性或對已有的屬性進行後續處理(比如說對密碼進行MD5加密處理),以適應實際的資料表欄位。因為有些資料表欄位(比如說使用者註冊時間、註冊IP)的值不能或不必由使用者輸入,而是能或必須由系統產生。通常這些由系統產生的值或後續處理需要手動(在控制器中)寫代碼進行處理,但是ThinkPHP為我們提供了一種更好的解決方案,即在create()方法中自動實現!
通過$_auto屬性是由多個填滿因數組成的數組,而一個填滿因數也是一個數組,故$_auto屬性是一個二維數組
1、填滿因數格式
array(填充欄位,填充內容,填充條件,附加規則)
·填充欄位
填充欄位理論上可以是任何值,但是實際開發中,一般有兩種情況,一是資料對象中已有的(因為自動完成是在建立資料對象之後),以進行後續處理(比如說md5加密處理);二是資料對象中沒有但資料表中有的實際欄位(說的準確點,應該是不能為null的欄位),以給該資料對象添加可以插入到資料表的屬性!
與自動驗證的驗證欄位區別開
從第一種情況可以看出,自動完成實際上是可以覆蓋表單的提交項目的!
·填充內容(填充規則)
同樣必須得配合附加規則一起使用
·填充條件
同驗證因子驗證時間含義
Model:: MODEL_INSERT 或者1 新增資料的時候處理(預設)
Model:: MODEL_UPDATE 或者2更新資料的時候處理
Model:: MODEL_BOTH 或者3所有情況都進行處理
·附加規則
function表示填充內容是一個函數
callback表示填充內容是當前模型類的一個方法
field表示填充內容是其它一個欄位的值
string表示填充內容是一個字串(預設)
2、同自動驗證一樣,也是可以setProperty()方法動態修改自動完成規則的
3、與自動驗證不同,自動完成的function或callback傳回值就是填滿因數的填充內容,而自動驗證的function或callback傳回值是一個布爾值
四、自動對應
所謂自動對應,就是在根據使用者的輸入(通常是POST過來的表單)建立了資料對象之前,自動的將表單相關控制項name屬性值映射成資料表中相應欄位名,以便於建立資料對象。因為如果用於建立資料對象的數組(通常是$_POST)中的元素鍵在實際的資料表中找不到相同的欄位名,那麼該元素就不會被添加到資料對象中。通常這個映射的操作需要手動(在控制器中)寫代碼進行處理(如下),但是ThinkPHP也為我們提供了一種更好的解決方案,即在create()方法中自動實現!
有人會說,這麼麻煩幹嘛咧,直接將表單中的name屬性值寫成與資料表中實際欄位名一樣不就可以了嗎?其實這種做法功能上是可以的,但是不安全!因為這樣做的話,使用者就可以通過name屬性值知道資料表中的實際欄位名,從安全的角度來看,這種做法是不可取的!
ThinkPHP教程_PHP架構之ThinkPHP(十)【三大自動】