驗證規則的定義通常有兩種方式,如果你使用了驗證器的話,通常通過`rule`屬性定義驗證規則,而如果使用的是獨立驗證的話,則是通過`rule`方法進行定義。
## 屬性定義
屬性定義方式僅限于驗證器,通常類似于下面的方式:
~~~
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
}
~~~
>[danger] 系統內置了一些常用的驗證規則可以滿足大部分的驗證需求,具體每個規則的含義參考內置規則一節。
因為一個字段可以使用多個驗證規則(如上面的`age`字段定義了`number`和`between`兩個驗證規則),在一些特殊的情況下,為了避免混淆可以在`rule`屬性中使用數組定義規則。
~~~
<?php
namespace app\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => ['require', 'max' => 25, 'regex' => '/^[\w|\d]\w+/'],
'age' => ['number', 'between' => '1,120'],
'email' => 'email',
];
}
~~~
## 方法定義
如果使用的是獨立驗證(即手動調用驗證類進行驗證)方式的話,通常使用`rule`方法進行驗證規則的設置,舉例說明如下。獨立驗證通常使用`Facade`或者自己實例化驗證類。
~~~
$validate = \think\facade\Validate::rule('age', 'number|between:1,120')
->rule([
'name' => 'require|max:25',
'email' => 'email'
]);
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
];
if (!$validate->check($data)) {
dump($validate->getError());
}
~~~
>[info] `rule`方法傳入數組表示批量設置規則。
`rule`方法還可以支持使用對象化的規則定義。
我們把上面的驗證代碼改為
~~~
use think\facade\Validate;
use think\validate\ValidateRule as Rule;
$validate = Validate::rule('age', Rule::isNumber()->between([1,120]))
->rule([
'name' => Rule::isRequire()->max(25),
'email' => Rule::isEmail(),
]);
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
];
if (!$validate->check($data)) {
dump($validate->getError());
}
~~~
可以對某個字段使用閉包驗證,例如:
~~~
$validate = Validate::rule([
'name' => function($value) {
return 'thinkphp' == strtolower($value) ? true : false;
},
]);
~~~
閉包支持傳入兩個參數,第一個參數是當前字段的值(必須),第二個參數是所有數據(可選)。
>[danger] 如果使用了閉包進行驗證,則不再支持對該字段使用多個驗證規則。
閉包函數如果返回true則表示驗證通過,返回false表示驗證失敗并使用系統的錯誤信息,如果返回字符串,則表示驗證失敗并且以返回值作為錯誤提示信息。
~~~
$validate = Validate::rule([
'name' => function($value) {
return 'thinkphp' == strtolower($value) ? true : '用戶名錯誤';
},
]);
~~~
>[danger] 屬性方式定義驗證規則不支持使用對象化規則定義和閉包定義
## 全局擴展
你可以在擴展包或者應用里面全局注冊驗證規則,使用方法
```
Validate::maker(function($validate) {
$validate->extend('extra', 'extra_validate_callback');
});
```
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 請求流程
- 架構總覽
- 入口文件
- 多應用模式
- URL訪問
- 容器和依賴注入
- 服務
- 門面
- 中間件
- 事件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 路由參數
- 路由中間件
- 路由分組
- 資源路由
- 注解路由
- 路由綁定
- 域名路由
- MISS路由
- 跨域請求
- URL生成
- 控制器
- 控制器定義
- 基礎控制器
- 空控制器
- 資源控制器
- 控制器中間件
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 數據庫
- 連接數據庫
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- cacheAlways
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 獲取查詢參數
- 查詢事件
- 獲取器
- 事務操作
- 存儲過程
- 數據集
- 數據庫驅動
- 模型
- 定義
- 模型字段
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- JSON字段
- 獲取器
- 修改器
- 搜索器
- 數據集
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 虛擬模型
- 視圖
- 模板變量
- 視圖過濾
- 模板渲染
- 模板引擎
- 視圖驅動
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 表單令牌
- 注解驗證
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 上傳
- 命令行
- 啟動內置服務器
- 查看版本
- 自動生成應用目錄
- 創建類庫文件
- 清除緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 輸出路由定義
- 自定義指令
- Debug輸出級別
- 擴展庫
- 數據庫遷移工具
- Workerman
- think助手工具庫
- 驗證碼
- Swoole
- 附錄
- 助手函數
- 升級指導
- 更新日志