ThinkPHP Model 基類內建 $_validate 屬性,定義驗證規則陣列,表單提交時自動檢查,失敗回傳錯誤訊息。
protected $_validate = array(
// 格式: array(驗證字段, 驗證規則, 錯誤提示, 驗證條件, 附加規則, 驗證時間)
array("title", "require", "標題必須!"),
array('categoryId', 'require', "分類必須!"),
array('content', 'require', "內容必須!"),
array('verify', 'require', '驗證碼必須!'),
array('verify', 'CheckVerify', '驗證碼錯誤!', 0, 'callback'),
);
| 參數 | 名稱 | 說明 | 可選值/範例 |
|---|---|---|---|
| 1 | 驗證字段 | 表單欄位名,不一定是資料庫欄位 | title, email, password, confirm_password |
| 2 | 驗證規則 | 內建規則名、正則、函數名、回調方法 | require, email, /regex/, checkFunc, callback |
| 3 | 錯誤提示 | 驗證失敗顯示訊息 | "電子郵件格式錯誤" |
| 4 | 驗證條件 | 何時觸發驗證 | 0/EXISTS_VALIDATE(預設), 1/MUST_VALIDATE, 2/VALUE_VALIDATE |
| 5 | 附加規則 | 規則類型修飾符 | regex, function, callback, confirm, equal, in, unique |
| 6 | 驗證時間 | 新增/編輯/全部 | 1/MODEL_INSERT, 2/MODEL_UPDATE, 3/MODEL_BOTH(預設) |
$validate = array(
'require' => '/.+/',
'email' => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
'url' => '/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@\[\]\':+!]*([^<>""])*$/',
'currency'=> '/^\d+(\.\d+)?$/',
'number' => '/^\d+$/',
'zip' => '/^[1-9]\d{5}$/',
'integer' => '/^[-\+]?\d+$/',
'double' => '/^[-\+]?\d+(\.\d+)?$/',
'english' => '/^[A-Za-z]+$/',
);
protected $_validate = array(
// 1. 正則驗證
array('username', '/^[a-z]\w{5,15}$/i', '用戶名必須字母開頭,6-16 位', 0, 'regex'),
// 2. 函數驗證 (自訂函數)
array('password', 'checkPwdStrength', '密碼強度不足', 0, 'function'),
// 3. 回調方法驗證 (Model 方法)
array('verify', 'checkVerifyCode', '驗證碼錯誤', 0, 'callback'),
// 4. 兩欄位一致 (確認密碼)
array('repassword', 'password', '兩次密碼不一致', 0, 'confirm'),
// 5. 等於特定值
array('status', 1, '狀態必須為啟用', 0, 'equal'),
// 6. 在範圍內
array('type', array(1,2,3), '類型錯誤', 2, 'in'), // 條件 2: 值不為空時驗證
// 7. 唯一性驗證 (資料庫查詢)
array('email', '', '電子郵件已存在', 0, 'unique', 1), // 時間 1: 新增時
);
// 回調方法範例
protected function checkVerifyCode($code) {
return md5($code) === session('verify');
}
// 函數驗證範例
function checkPwdStrength($pwd) {
return strlen($pwd) >= 8
&& preg_match('/[A-Z]/', $pwd)
&& preg_match('/[a-z]/', $pwd)
&& preg_match('/\d/', $pwd)
&& preg_match('/[\W_]/', $pwd);
}
protected $_validate = array(
array('verify','require','驗證碼必須!'), // 預設正則 require
array('name','','帳號名稱已經存在!',0,'unique',1), // 新增時檢查 name 唯一
array('value',array(1,2,3),'值的範圍不正確!',2,'in'), // 值不為空時檢查範圍
array('repassword','password','確認密碼不正確',0,'confirm'), // 確認密碼一致
array('password','checkPwd','密碼格式不正確',0,'function') // 自訂函數
);
public function add() {
$model = D('Article'); // 實例化 Model
if ($model->create()) { // 自動執行 $_validate 驗證
if ($model->add()) {
$this->success('新增成功');
} else {
$this->error('寫入失敗');
}
} else {
// 驗證失敗,$model->getError() 取得錯誤訊息
$this->error($model->getError());
}
}
$model->create($_POST, 1) 第二參數指定場景 (1=新增, 2=編輯),配合驗證時間參數_initialize() 中根據條件修改 $_validatevalidate($rules)->create() 臨時覆蓋規則ajaxReturn(['status'=>0, 'msg'=>$model->getError()])