對于任何應用程序,數據校驗都是重要部分,因為它有且于確保模型中的數據遵守了應用程序的業務規則。 例如,你可能想要確保密碼最少要有8位,或者確保用戶名唯一。 定義校驗規則使表單處理非常非常簡單。
校驗過程有許多不同的面。本節覆蓋的是其中模型這一面。 即:在調用模型中的 save() 方法時發生了什么。 關于如何處理校驗錯誤的顯示的更多信息,參見: 表單助手。
數據校驗的第一步是在模型中建立校驗規則。這是用模型定義中的 Model::validate 數組實現的:
在上面的示例中,$validate 數組被添加到 User 模型中,但數組不包含校驗規則。 假設 users 表有 login、password、email 和 born 列,下面的示例展示了應用在這些列上的一些簡單的校驗規則:
上例展示了如何向模型列添加校驗規則。對于 login 列,只接受字母和數字,email 必須是有效的郵件地址,born 必須是有效的日期。 如果提交的數據違反了定義的規則,這些校驗規則定義能使 CakePHP 自動在表單中顯示錯誤信息。
CakePHP 有許多校驗規則,且易于使用。 一些內置的規則允許你校驗 email、URL 和 信用卡數字的格式 - 我們稍后會講到它們的細節。
下面是一個非常復雜的校驗的示例,利用了一些內置的校驗規則:
其中兩條是為 login 定義的:它只能包含字母和數字,并且長度必須在5至15之間。 password 列必須不少于8位長。 email 必須是有效的郵件地址,并且 born 必須是有效的日期。 還要注意的是,怎樣定義校驗失敗時顯示特定的錯誤信息。
上面的例子中,單個列可以使用多個校驗規則。如果內置的規則不能滿足你的要求,你可以添加自己需要的校驗規則。
現在你已經看到了數據校驗的全景,讓我們瞧瞧如何在模型中定義這些規則。有三種不同的方法:簡單數組、每個列的單個規則、每個列的多個規則。
顧名思義,這是定義校驗規則最簡單的方法。 這種方法定義規則是標準語法是:
‘fieldName’ 是規則所適用的列的名字,‘ruleName’是預定義的規則名,例如 ‘alphaNumeric’、’email’ 或者 ‘isUnique’。
例如,要確保用戶所提供的是格式正確的郵件地址,可以使用如下規則:
每個列一個規則
這種定義手法對校驗規則的工作有更好的控制。在我們討論這個之前,先來看看向單個列添加一條規則的標準用法:
‘rule’ 鍵是必須的。如果僅設置了 ‘required’ => true,表單驗證將無法正確工作。因為 ‘required’ 不是實際的規則。
正如你看到的,每個列(上面只演示了一個列)與包含了如下五個鍵的數組關聯:‘rule’、 ‘required’、 ‘allowEmpty’、 ‘on’ 和 ‘message’。讓我們仔細地觀察這幾個鍵。
‘rule’ 方法定義了校驗方面并且指定了一個值或者一個數組。這個特定的 ‘rule’ 可能是模型中的一個方法的名字,核心 Validation 類的一個方法的名字,或者正則表達式。要了解關于默認規則的更多信息,請參見 內核核驗規則。
如果 rule 不包含任何參數,’rule’ 可以是單個值,例如:
如果 rule 包含參數(例如 max,min 或者范圍),’rule’ 將是一個數組:
記住,用數組方式定義規則時,’rule’ 鍵是必須的。
這個鍵接受一個邏輯值、create 或者 update。將其設置為 true 將使這一列總是被必須的。設置為 create 或者update 將使這一列只在更新或創建操作時必須。如果 ‘required’ 等于 true,數組中必須提供此列。例如,如果定義如下校驗規則:
傳遞給模型的 save() 方法的數據必須包含提供給 login 列的數據。如果它不存在,那么校驗失敗。這個鍵的默認值為邏輯 false。
required => true 與 校驗規則中的 notEmpty() 不是一回事兒。required => true 表示這個數組 鍵 必須提供 - 不意味著它必須有值。如果數據集沒有提供,校驗失敗,但是如果提交了空值(’‘)是有可能成功的(這依賴于規則的詳細定義)。
在 2.1 版更改: 添加了對 create 和 update 的支持。
如果設置為 false,這個列的值必須是 非空的,, the field value must be nonempty, 其中 “nonempty” 非空的定義為 !empty($value) || is_numeric($value)。 對于數值檢測,當 $value 為0時,CakePHP 認為是正確的。
required 與 allowEmpty 的不同可能會造成混亂。'required' => true 意味著 $this->data 中不提供帶有這個列的鍵 就不能保存模型; 而 'allowEmpty' => false 則像上面描述的尋,是確保這個列的 值 必須是非空的。
‘on’ 鍵可以被設置為 ‘update’ 或 ‘create’。它提供了允許一些規則應用于創建新記錄的過程中或者更新記錄的過程中的機制。
如果一條規則被定義成 ‘on’ => ‘create’,這條規則僅在創建新記錄的過程中有效。類似的,如果它被定義成 ‘on’ => ‘update’,將只在更新記錄的過程中有效。
‘on’ 的默認值為空(null)。當 ‘on’ 為空(null),這條規則在創建和更新過程中同時生效。
message 鍵為規則自定義校驗錯誤時的顯示信息:
每個列多條規則
上面的技術為我們提供了比簡單的規則分配更大的靈活性,再進一步,我們能獲得更詳細的數據校驗控制。下面我們介紹一種允許我們為每個列賦予多個規則的技術。
想要為單個列賦多個校驗規則,基本的寫法如下:
正像你看到的那樣,這和上一節中所做的非常相似。在那兒,每個列僅有一個校驗參數數組。在這兒,每個 ‘fieldName’ 是一個規則數組的索引。每個 ‘ruleName’ 包含一個校驗參數數組。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
上一篇 Cakephp 的命名規則
下一篇 CakePHP 約定