## 數據驗證
數據驗證也是系統改動比較大的一個地方。
模型中,可以定義`$validate`屬性設定數據驗證規則,當你需要寫入數據時(使用模型非db寫入),系統會自動驗證。這里并不是真的使用tp自帶的模型數據驗證(新版tp已經取消了模型驗證),同樣是使用實例化Validate對象來進行數據驗證。
先總覽下`$validate`格式:
~~~
protected $validate = [
//字段只有一個規則
'字段1' => [
'rule' = > '驗證規則',
'message' => '錯誤信息提示',
'on' => 'add'
],
//字段有一個或多個規則
'字段2' => [
[
'rule' = > '驗證規則',
'message' => '錯誤信息提示',
'on' => 'edit'
],
[
'rule' = > '驗證規則'
]
]
];
~~~
以字段為鍵 => 規則數組
字段鍵下可以是一維數組(只有一個規則),也可以是二維數組(定義一個或多個規則)。
每個規則下可以有4個關鍵詞:rule、message、on
### message:
用于定義錯誤提示信息,如果沒有使用TP框架默認值處理
* * * * *
### on:
用于定義驗證場景,系統默認有的驗證場景有2個:
add:添加場景
edit:修改場景
~~~
[
'on' => 'add' //只會在 新增 時驗證該規則
]
[
'on' => 'edit' //只會在 更新 時驗證該規則
]
~~~
如果沒有定義on關鍵詞,表示 新增 和 更新 都會驗證該規則。
* * * * *
### rule:
rule關鍵詞,每個規則都**必須**含有,用于定義當前驗證規則。
我們定義的數據驗證數組,最后系統還是自動會處理成TP能識別的那種格式,所以rule支持TP本身所有的驗證規則。
[TP內置規則傳送門](http://www.hmoore.net/manual/thinkphp6_0/1037629)
#### 格式驗證類
require:驗證某個字段必須,例如:
~~~
[
'rule' => 'require'
]
~~~
number 或者 integer :驗證某個字段的值是否為數字(采用filter_var驗證),例如:
~~~
[
'rule' => 'number'
]
~~~
float:驗證某個字段的值是否為浮點數字(采用filter_var驗證),例如:
~~~
[
'rule' => 'float'
]
~~~
boolean:驗證某個字段的值是否為布爾值(采用filter_var驗證),例如:
~~~
[
'rule' => 'boolean'
]
~~~
email:驗證某個字段的值是否為email地址(采用filter_var驗證),例如:
~~~
[
'rule' => 'email'
]
~~~
array:驗證某個字段的值是否為數組,例如:
~~~
[
'rule' => 'array'
]
~~~
accepted:驗證某個字段是否為為 yes, on, 或是 1。這在確認"服務條款"是否同意時很有用,例如:
~~~
[
'rule' => 'accepted'
]
~~~
date:驗證值是否為有效的日期,例如:
~~~
[
'rule' => 'date'
]
~~~
alpha:驗證某個字段的值是否為字母,例如:
~~~
[
'rule' => 'alpha'
]
~~~
alphaNum:驗證某個字段的值是否為字母和數字,例如:
~~~
[
'rule' => 'alphaNum'
]
~~~
alphaDash:驗證某個字段的值是否為字母和數字,下劃線_及破折號-,例如:
~~~
[
'rule' => 'alphaDash'
]
~~~
chs:驗證某個字段的值只能是漢字,例如:
~~~
[
'rule' => 'chs'
]
~~~
chsAlpha:驗證某個字段的值只能是漢字、字母,例如:
~~~
[
'rule' => 'chsAlpha'
]
~~~
chsAlphaNum:驗證某個字段的值只能是漢字、字母和數字,例如:
~~~
[
'rule' => 'chsAlphaNum'
]
~~~
chsDash:驗證某個字段的值只能是漢字、字母、數字和下劃線_及破折號-,例如:
~~~
[
'rule' => 'chsDash'
]
~~~
activeUrl:驗證某個字段的值是否為有效的域名或者IP,例如:
~~~
[
'rule' => 'activeUrl'
]
~~~
url:驗證某個字段的值是否為有效的URL地址(采用filter_var驗證),例如:
~~~
[
'rule' => 'url'
]
~~~
ip:驗證某個字段的值是否為有效的IP地址(采用filter_var驗證),例如:
~~~
[
'rule' => 'ip'
]
~~~
dateFormat:驗證某個字段的值是否為指定格式的日期,例如:
~~~
[
'rule' => ['dateFormat', 'y-m-d']
]
[
'rule' => 'dateFormat:y-m-d'
]
~~~
#### 長度和區間驗證類
in:驗證某個字段的值是否在某個范圍,例如:
~~~
[
'rule'=>['in', '1,2,3']
]
[
'rule' => 'in:1,2,3'
]
[
'rule' => ['in', 1, 2, 3]
]
~~~
notIn:驗證某個字段的值是否在某個范圍,例如:
~~~
[
'rule'=>['notIn', '1,2,3']
]
[
'rule' => 'notIn:1,2,3'
]
[
'rule' => ['notIn', 1, 2, 3]
]
~~~
between:驗證某個字段的值是否在某個區間,例如:
~~~
[
'rule'=>['between', '1,10']
]
[
'rule' => 'between:1,10'
]
[
'rule' => ['between', 1, 10]
]
~~~
notBetween:驗證某個字段的值不在某個范圍,例如:
~~~
[
'rule'=>['notBetween', '1,10']
]
[
'rule' => 'notBetween:1,10'
]
[
'rule' => ['notBetween', 1, 10]
]
~~~
length:驗證某個字段的值的長度是否在某個范圍,例如:
~~~
[
'rule'=>['length', '4,25']
]
[
'rule' => 'length:4,25'
]
[
'rule' => ['length', 4, 25]
]
~~~
max:驗證某個字段的值的最大長度,例如:
~~~
[
'rule'=>['max', '25']
]
[
'rule' => 'max:25'
]
~~~
min:驗證某個字段的值的最小長度,例如:
~~~
[
'rule'=>['min', '5']
]
[
'rule' => 'min:5'
]
~~~
after:驗證某個字段的值是否在某個日期之后,例如:
~~~
[
'rule'=>['after', '2016-3-18']
]
[
'rule' => 'after:2016-3-18'
]
~~~
before:驗證某個字段的值是否在某個日期之前,例如:
~~~
[
'rule'=>['before', '2016-3-18']
]
[
'rule' => 'before:2016-3-18'
]
~~~
expire:驗證當前操作(注意不是某個值)是否在某個有效日期之內,例如:
~~~
[
'rule'=>['expire', '2016-2-1', '2016-10-1']
]
[
'rule' =>'expire:2016-2-1,2016-10-01'
]
[
'rule' =>['expire', '2016-2-1, 2016-10-1']
]
~~~
allowIp:驗證當前請求的IP是否在某個范圍,例如:
~~~
[
'rule'=>['allowIp', '114.45.4.55', '114.45.4.56']
]
[
'rule' =>'allowIp:114.45.4.55,114.45.4.56'
]
[
'rule' =>['allowIp', '114.45.4.55, 114.45.4.56']
]
~~~
denyIp:驗證當前請求的IP是否禁止訪問,例如:
~~~
[
'rule'=>['denyIp', '114.45.4.55', '114.45.4.56']
]
[
'rule' =>'denyIp:114.45.4.55,114.45.4.56'
]
[
'rule' =>['denyIp', '114.45.4.55, 114.45.4.56']
]
~~~
eq :驗證是否等于某個值,例如:
~~~
[
'rule'=>['eq', 100]
]
[
'rule' =>'=:100'
]
//手冊上可以= 和same,測試報錯
~~~
egt :驗證是否大于等于某個值,例如:
~~~
[
'rule'=>['egt', 100]
]
[
'rule' =>'egt:100'
]
~~~
gt :驗證是否大于某個值,例如:
~~~
[
'rule'=>['gt', 100]
]
[
'rule' =>'gt:100'
]
~~~
elt :驗證是否小于等于某個值,例如:
~~~
[
'rule'=>['elt', 100]
]
[
'rule' =>'elt:100'
]
~~~
lt :驗證是否小于某個值,例如:
~~~
[
'rule'=>['lt', 100]
]
[
'rule' =>'lt:100'
]
~~~
lt :驗證是否小于某個值,例如:
~~~
[
'rule'=>['lt', 100]
]
[
'rule' =>'lt:100'
]
~~~
#### filter驗證
支持使用filter_var進行驗證,例如:
~~~
'rule' =>'filter:validate_ip'
~~~
#### 正則驗證
支持使用正則驗證,例如:
~~~
'rule' =>['regex', '/^(yes|on|1)$/i']
~~~
#### 其他
unique:table,field,except,pk:驗證當前請求的字段值是否為唯一的,例如:
~~~
'rule' => ['unique', 'user']
~~~
requireIf:field,value:驗證某個字段的值等于某個值的時候必須,例如:
~~~
'rule' => 'requireIf:account,1'
~~~
requireWith:field:驗證某個字段有值的時候必須,例如:
~~~
'rule' => 'requireWith:account'
~~~
#### 自定義驗證規則
call : 通過自定義模型方法回調驗證
~~~
'rule' => ['call', '方法名']
~~~
eg:比如欄目模型中:
~~~
protected $_validate =[
'parent_id' => [
[
'rule' =>['egt', 1],
'message' => '請選擇父級導航'
],
[
'rule' => array('call', 'checkParent'),
'on' => 'edit'
]
]
];
public function checkParent($value, $rule, $data)
{
if ($value == $data['id'] || in_array($value, (array)menu('children', $data['id']))) {
return '不能選擇本欄目以及其子欄目做為父級';
}
return true;
}
~~~
你需要自己準備一個方法來進行自定義驗證規則,驗證方法可以傳入的參數共有5個(后面三個根據情況選用),依次為:
* 驗證數據
* 驗證規則
* 全部數據(數組)
return true,表示驗證通過;
return 字符串,表示驗證失敗返回錯誤提示信息
* * * * *
### 不驗證數據
~~~
model('User')->isValidate(false)->save($data);
~~~
這樣將不會驗證數據,直接寫入。
### 獲取錯誤信息
~~~
$user = model('User');
$rslt = $user->save($data);
if (!$rslt) {
pr($user->getError());
}
~~~
* * * * *
當然,驗證我們也可以完全安裝TP手冊來,不使用系統定義的`$validate`屬性。
- 2.0開發手冊
- 基礎
- 簡介
- 安裝
- 目錄
- 規范(必看)
- 快速開發
- 創建模型
- 字段管理
- 無限級開發
- 模型Model
- 定義
- 方法
- 事件
- 關聯
- 關聯查詢
- 驗證
- 后臺控制器Controller
- 定義
- 列表【index】
- 新增【create】
- 修改【modify】
- 刪除【delete】
- 詳細【detail】
- 文本審核【antispam】
- 清空數據【clearData】
- 自定義頁面
- 視圖View
- 視圖使用
- 引入CSS和JS
- 基礎表單構建Form
- 布局表單構建FormPage
- 表單構建器的基礎使用
- 表單項
- 表單分組
- 表單觸發器
- 表單布局
- 數據提交驗證和入庫
- 集成tinymce編輯器
- 集成nkeditor編輯器
- 表格構建Table
- 表格構建器基礎使用
- 表格構建器列表字段相關
- 自定義列表頭部工具按鈕
- 自定義列表項工具按鈕
- 自定義搜索
- 定義列表側邊欄
- 靜態數據
- 更多屬性和回調
- 自定義模板V2.1.0
- 列表統計輸出V2.1.2
- 常見問題
- 自定義應用
- 創建新應用
- 應用開發
- API應用
- 自定義插件
- 創建新插件
- 雜項
- 認證Auth
- 權限管理
- 上傳Upload
- 批量導入
- 助手庫
- 系統配置
- 字典
- 二維碼生成
- 源碼修改
- 常見問題
- 小技巧,小細節
- 插件
- oauth
- APP一鍵登錄
- 微信小程序登錄
- 2.0CMS建站
- 基礎
- 安裝
- 建站
- Callback
- 引入CSS和JS
- 模板
- 欄目數據
- 列表頁數據
- 詳細頁數據
- 欄目封面
- 自定義表單
- 其他數據和自定義數據
- wap視圖層
- 前臺搜索
- API開發
- CMS應用日志
- CMS升級指導
- 中臺-SAAS開發
- 安裝
- 中臺日志
- 中臺升級指導
- ★★2.0視頻教程★★
- 附錄
- Admin核心更新日志
- Admin核心升級指導
- composer
- 安全