天天看點

thinkphp模型驗證總結php thinkphp 模型自動驗證 靜态定義 動态驗證

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;
}


?>