php thinkphp 模型自動驗證 靜态定義 動态驗證
定義 demos
驗證字段, 驗證規則, 錯誤提示,[ 驗證條件, 附加規則, 驗證時間])
驗證條件(可選)
包含下面幾種情況:
0 存在字段就驗證(預設)
1 必須驗證
2 值不為空的時候驗證
驗證時間(可選)
self::MODEL_INSERT 或者 1 新增資料時候驗證
self::MODEL_UPDATE 或者 2 編輯資料時候驗證
self::MODEL_BOTH 或者 3 全部情況下驗證(預設)
這裡的**驗證時間**需要注意,并非隻有這三種情況,你可以根據業務需要增加其他的驗證時間
array('name', 'require', '酒的名稱必須填寫', ),
array('username', 'require', '使用者名不可為空', ),
array('quantity', 'number', '瓶數請填寫數字'),
// 2 值不為空的時候驗證
array('email', 'email', '郵箱位址不合法', ),
// in
array('is_origin_box', array('是', '否'), '請填寫是或否', , 'in'),
array('gender', array('男', '女', '保密'), '請填寫男、女或保密', , 'in'),
// between 1901~今年
array('year', array(, ), '年份填寫範圍需為1901~今年', , 'between'),
// 正規表達式驗證
array('username', '/^.*[^\d].*$/', '使用者名不可為純數字', ),
array('birthday', '/^\d{4}-\d{2}-\d{2}$/', '生日填寫不規範', ),
array('phone', '/^13[0-9]{1}[0-9]{8}$|15[01689]{1}[0-9]{8}$|18[289][0-9]{8}$/', '手機号碼格式不正确', ),
// unique
// 在新增的時候驗證username字段是否唯一
array('username', '', '使用者名已經存在', , 'unique', ),
// cofirm 驗證表單中的兩個字段是否相同,定義的**驗證規則**是一個字段名
array('password_confirmation', 'password', '兩次輸入密碼不一緻', , 'confirm'),
// callback 方法驗證,定義的驗證規則是**目前模型類**的一個方法
array('username', 'checkUsername', '使用者名中含有非法字元', , 'callback'),
// 函數驗證,定義的驗證規則是一個函數名
array('password', 'checkPwd', '密碼格式不正确', , 'function'),
靜态定義
在模型類裡面定義 $_validate 屬性
// 驗證規則
protected $_validate = array(
array('username', 'require', '使用者名不可為空', ),
array('email', 'email', '郵箱位址不合法', ),
array('gender', array('男', '女', '保密'), '請填寫男、女或保密', , 'in'),
array('year', array(, ), '年份填寫範圍需為1901~今年', , 'between'),
array('username', '/^.*[^\d].*$/', '使用者名不可為純數字', ),
// 在新增的時候驗證username字段是否唯一
array('username', '', '使用者名已經存在', , 'unique', ),
array('password_confirmation', 'password', '兩次輸入密碼不一緻', , 'confirm'),
array('username', 'checkUsername', '使用者名中含有非法字元', , 'callback'),
array('password', 'checkPwd', '密碼格式不正确', , 'function'),
);
定義好驗證規則後,就可以在使用create方法建立資料對象的時候自動調用
// 執行個體化user對象
$user = D('user');
if (!$user->create()) {
// 如果建立失敗,表示驗證沒有通過,輸出錯誤提示資訊
exit($user->getError());
}
靜态定義方式因為必須定義模型類,是以隻能用D函數執行個體化模型
動态驗證
$rules = array(
array('username', 'require', '使用者名不可為空', ),
array('email', 'email', '郵箱位址不合法', ),
array('gender', array('男', '女', '保密'), '請填寫男、女或保密', , 'in'),
array('year', array(, ), '年份填寫範圍需為1901~今年', , 'between'),
array('username', '/^.*[^\d].*$/', '使用者名不可為純數字', ),
// 在新增的時候驗證username字段是否唯一
array('username', '', '使用者名已經存在', , 'unique', ),
array('password_confirmation', 'password', '兩次輸入密碼不一緻', , 'confirm'),
array('username', 'checkUsername', '使用者名中含有非法字元', , 'callback'),
array('password', 'checkPwd', '密碼格式不正确', , 'function'),
);
// 執行個體化user對象
$user = M('user');
if (!$user->validate($rules)->create()) {
// 如果建立失敗,表示驗證沒有通過,輸出錯誤提示資訊
exit($user->getError());
}
// 驗證通過,執行後續操作
// todo
舉個栗子
// 附加規則 function
// 自定義函數驗證密碼格式
array('password', 'checkPwd', '密碼格式不正确', 0, 'function'),
create function.php
// 注意php檔案名好像隻能是 function.php
Application/Common/Common/function.php
function.php
<?php
function checkPwd($password)
{
// handle $password
// todo
// return true;
// or
// return false;
}
?>