TP6中驗證器的使用
一、定義驗證器
方式1:在目錄app目錄下,生成 validate目錄,然后創建相應的驗證器。
方式2:通過命令行工具執行命令: php think make:validate User
剛生成的驗證器,代碼如下:
<?php declare (strict_types = 1); namespace app\validate; use think\Validate; class User extends Validate { /** * 定義驗證規則 * 格式:'字段名' => ['規則1','規則2'...] * * @var array */ protected $rule = [ ]; /** * 定義錯誤信息 * 格式:'字段名.規則名' => '錯誤信息' * * @var array */ protected $message = [ ]; }
二、簡單驗證示例:
HTML代碼:
<form action="/index.php/test_validate/Validate1Act" method="post"> <p>賬戶名: <input type="text" name="user_name" /> </p> <p>手機號: <input type="text" name="user_mobile" /> </p> <p>姓 名: <input type="text" name="user_truename" /> </p> <p>身份證: <input type="text" name="user_idcard" /> </p> <p><input type="submit" value="提交"></p> </form>
驗證器代碼:app/validate/User.php
<?php declare (strict_types = 1); namespace app\validate; use think\Validate; class User extends Validate { /** * 定義驗證規則 * 格式:'字段名' => ['規則1','規則2'...] * * @var array */ protected $rule = [ 'user_name' => 'require|length:6,20', 'user_mobile' => 'mobile', 'user_truename' => 'chs', 'user_idcard' => 'idCard' ]; /** * 定義錯誤信息 * 格式:'字段名.規則名' => '錯誤信息' * * @var array */ protected $message = [ 'user_name.require' => '賬號不能為空', 'user_name.length' => '賬號長度需在6-20個字符之間', 'user_mobile' => '手機號格式不正確', 'user_truename' => '姓名必須為中文', 'user_idcard' => '身份證號格式不正確' ]; }
控制器代碼:
/** * 顯示表單模板 */ public function validate1() { return view("test/validate1"); } /** * 驗證 */ public function Validate1Act() { $data = request()->param(); try { $res = validate(User::class)->check($data); return "驗證通過了"; } catch (ValidateException $e) { return "驗證失敗:".$e->getError(); } }
三、批量驗證
批量驗證就是,一次把所有的錯誤以數組的形式返回到控制器。
批量驗證,是需要增加 batch(true)的規則
代碼如下:
/** * 驗證 */ public function Validate1Act() { $data = request()->param(); try { $res = validate(User::class)->batch(true)->check($data); return "驗證通過了"; } catch (ValidateException $e) { $msgs = $e->getError(); $msgs_str = implode(",",$msgs); return "驗證失敗:".$msgs_str; } }
四:自定義驗證
注意:
1、自定義規則不能和內置規則重復
2、自定義規則中參數
protected $rule = [ 'user_name' => 'require|length:6,20|checkName', ]; protected $message = [ 'user_name.require' => '賬號不能為空', 'user_name.length' => '賬號長度需在6-20個字符之間', ]; /** * 自定義驗證規則 * $value 表示輸入的值 * $rule 驗證的規則 * $data 輸入的全部數據 */ protected function checkName($value, $rule, $data=[]) { if ($value == 'yangphp') { return true; } else { return "賬戶名錯誤"; } }
五、驗證場景
驗證器:
//表示當edit場景,只驗證 user_name 和 user_mobile protected $scene = [ 'edit' => ['user_name','user_mobile'], ];
控制器:
/** * 驗證2 */ public function Validate2Act() { $data = request()->param(); try { $res = validate(User::class)->scene('edit')->check($data); return "驗證通過了"; } catch (ValidateException $e) { $msg = $e->getError(); return json($msg); } }
當設定 edit場景只驗證 user_name ,user_mobile 的格式。 user_truename,user_idcard 則不驗證
六、驗證規則
1、require 驗證某個字段必須 2、number 驗證某個字段的值是否是純數字 3、integer 驗證某個字段的值是否為整數 4、float 驗證某個字段的值是否為浮點數字 5、boolean 驗證某個字段的值是否為布爾值 6、email 驗證某個字段的值是否為email地址 7、array 驗證某個字段的值是否為數組 8、accepted 驗證某個字段是否為為 yes, on, 或是 1 9、date 驗證值是否為有效的日期 10、alpha 驗證某個字段的值是否為純字母 11、alphaNum 驗證某個字段的值是否為字母和數字 12、alphaDash 驗證某個字段的值是否為字母和數字,下划線_及破折號- 13、chs 驗證某個字段的值只能是漢字 14、chsAlpha 驗證某個字段的值只能是漢字、字母 15、chsAlphaNum 驗證某個字段的值只能是漢字、字母和數字 16、chsDash 驗證某個字段的值只能是漢字、字母、數字和下划線_及破折號 17、cntrl 驗證某個字段的值只能是控制字符(換行、縮進、空格) 18、graph 驗證某個字段的值只能是可打印字符(空格除外) 19、print 驗證某個字段的值只能是可打印字符(包括空格) 20、lower 驗證某個字段的值只能是小寫字符 21、upper 驗證某個字段的值只能是大寫字符 22、space 驗證某個字段的值只能是空白字符 23、xdigit 驗證某個字段的值只能是十六進制字符串 24、activeUrl 驗證某個字段的值是否為有效的域名或者IP 25、url 驗證某個字段的值是否為有效的URL地址 26、ip 驗證某個字段的值是否為有效的IP地址 27、dateFormat:format 驗證某個字段的值是否為指定格式的日期 例如: 'create_time'=>'dateFormat:y-m-d' 28、mobile 驗證某個字段的值是否為有效的手機 29、idCard 驗證某個字段的值是否為有效的身份證格式 30、macAddr 驗證某個字段的值是否為有效的MAC地址 31、zip 驗證某個字段的值是否為有效的郵政編碼 32、in 驗證某個字段的值是否在某個范圍 例如:'num'=>'in:1,2,3' 33、notIn 驗證某個字段的值不在某個范圍 34、between 驗證某個字段的值是否在某個區間 35、notBetween 驗證某個字段的值不在某個范圍 36、length:num1,num2 驗證某個字段的值的長度是否在某個范圍 37、max:number 驗證某個字段的值的最大長度 38、min:number 驗證某個字段的值的最小長度 39、confirm 驗證某個字段是否和另外一個字段的值一致 例如:'repassword'=>'require|confirm:password' 自動匹配驗證規則: 如password和password_confirm是自動相互驗證 只需要使用 'password'=>'require|confirm'
七、表單令牌
驗證規則支持對表單的令牌驗證:
HTML:
<input type="hidden" name="__token__" value="{:token()}" /> //也可以直接使用 {:token_field()}
控制器驗證規則:
$check = request()->checkToken('__token__'); if(false === $check) { return "token 驗證失敗"; }