2008年3月26日 星期三

CakePHP 1.2 Model 資料驗証 (Data Validation) 簡介

Data Validation 是 Model 中最重要的功能,也是最重要的程式區塊。當要對資料庫進行Insert, Update時,都會執行這個區塊要設定來檢查資料是否正確。一般而言,寫網站程式會在對資料庫存取(不管是select, insert, update)都會先對資料做初步的檢查(例如:不能是空或空白字串;一定要數字;符合某種格式 - regex 檢查)。CakePHP在方面的設計,比1.1增強許多,在1.1的版本,只有Regex檢查,到了1.2可以針對單一個欄位做多種規則的檢查,也可以自訂函式來做驗証。CakePHP內建的規則可以查 your_cakephp1.2/cake/libs/validation.php

CakePHP的資料驗証設定很彈性,因此在設定上的寫法花樣很多,以下只例舉我常用的做法:

public $validate = array(
"account" => array(
/* 檢查是不是數字與英文字母的組合 */
"alphanumberic" => array(
"rule" => "alphaNumeric",
"message" => "只能是數字或英文字母",
"last" => true
), /* end alpha-numeric */
/* 檢查字串的長度在4~20之間 */
"length" => array(
"rule" => array("between", 4, 20),
"message" => "您的帳號長度不正確,只能 4~20字元",
"last" => true
), /* end length */
/* 檢查是不是唯一值 (自訂函式) */
"unique" => array(
"rule" => array("checkUnique", "account"),
"message" => "這個帳號已經註冊,請重新取一個",
"on" => "create"
) /* end unique */
),/* end for account */

}

資料驗証的使用方式是 "自訂的規則名稱" => array("rule" => "內建或自訂的規則", "message"=>"發生錯誤時,要顯示的訊息"),其中 "rule" => "內建或自訂的規則" ,如果使用的規則是Regex或者沒有額外參數的函式(像alphaNumeric,只要傳值去做驗証即可,不需要其他額外的參數),那就可以以字串的方式設定。相反的,如果規則是函式,且需要額外的參數時(像 between, 需要有最大、最小值),那就要以array的方式設定。

以下是其他參數的說明:

on: 值有"create"和"update",如果值是"create",意思是指在做insert時,才會使用這個驗証規則,同理是"update"時,只有在update資料庫時,才會使用。如果都不做設定的話,不論是要做insert或update,只要Controller有把這個欄位的值傳進來,就會使用這個規則做驗証。

last: 設定成 true 時(CakePHP預設值是false),是告知CakePHP只要這個規則沒通過時,就不要再執行同欄位的其他規則。

自訂函式說明:

以下是程式碼是截自CakePHP官網的說明,請見 http://book.cakephp.org/view/125/data-validation

function checkUnique($data, $fieldName) {
$valid = false;
if(isset($fieldName) && $this->hasField($fieldName))
{
$valid = $this->isUnique(array($fieldName => $data));
}
return $valid;
}

在寫自訂的函式時,請注意,第一個參數要保留給CakePHP把欄位的值傳進來,從第二個參數開始才是自訂的參數。像上面的checkUnique,$data是指傳進來的欄位值,$fieldName是指要檢查的欄位名稱。

參考資料:

http://book.cakephp.org/view/125/data-validation

張貼留言