1. 程式人生 > >TP5 validate驗證機制

TP5 validate驗證機制

首先使用驗證器驗證,在模組目錄下,建一個validate目錄,在其下面自定義要使用的驗證器,並讓它extends 框架的Validate類:

<?php
namespace app\admin\validate;

use think\Validate;

class User extends Validate{
    protected $rule = [
        'user_name'  => 'require|max:20',
        'password'  => 'require',
        'real_name'  => 'require|max:12',
        'email' => 'email',
        'qq'    => 'max:20',
        'phone'    => 'require|length:11',
    ];
}

這樣我們就有了一個針對user使用的自動驗證器,我們將要驗證的欄位,給他定義好對應的規則。

這裡注意:框架本身自帶的很多規則及其提示資訊,直接呼叫就好,如果不滿足需求,還支援自定義規則。

貼出框架原始碼:

// 驗證規則預設提示資訊
protected static $typeMsg = [
    'require'     => ':attribute require',
    'number'      => ':attribute must be numeric',
    'integer'     => ':attribute must be integer',
    'float'       => ':attribute must be float',
    'boolean'     => ':attribute must be bool',
    'email'       => ':attribute not a valid email address',
    'mobile'      => ':attribute not a valid mobile',
    'array'       => ':attribute must be a array',
    'accepted'    => ':attribute must be yes,on or 1',
    'date'        => ':attribute not a valid datetime',
    'file'        => ':attribute not a valid file',
    'image'       => ':attribute not a valid image',
    'alpha'       => ':attribute must be alpha',
    'alphaNum'    => ':attribute must be alpha-numeric',
    'alphaDash'   => ':attribute must be alpha-numeric, dash, underscore',
    'activeUrl'   => ':attribute not a valid domain or ip',
    'chs'         => ':attribute must be chinese',
    'chsAlpha'    => ':attribute must be chinese or alpha',
    'chsAlphaNum' => ':attribute must be chinese,alpha-numeric',
    'chsDash'     => ':attribute must be chinese,alpha-numeric,underscore, dash',
    'url'         => ':attribute not a valid url',
    'ip'          => ':attribute not a valid ip',
    'dateFormat'  => ':attribute must be dateFormat of :rule',
    'in'          => ':attribute must be in :rule',
    'notIn'       => ':attribute be notin :rule',
    'between'     => ':attribute must between :1 - :2',
    'notBetween'  => ':attribute not between :1 - :2',
    'length'      => 'size of :attribute must be :rule',
    'max'         => 'max size of :attribute must be :rule',
    'min'         => 'min size of :attribute must be :rule',
    'after'       => ':attribute cannot be less than :rule',
    'before'      => ':attribute cannot exceed :rule',
    'expire'      => ':attribute not within :rule',
    'allowIp'     => 'access IP is not allowed',
    'denyIp'      => 'access IP denied',
    'confirm'     => ':attribute out of accord with :2',
    'different'   => ':attribute cannot be same with :2',
    'egt'         => ':attribute must greater than or equal :rule',
    'gt'          => ':attribute must greater than :rule',
    'elt'         => ':attribute must less than or equal :rule',
    'lt'          => ':attribute must less than :rule',
    'eq'          => ':attribute must equal :rule',
    'unique'      => ':attribute has exists',
    'regex'       => ':attribute not conform to the rules',
    'method'      => 'invalid Request method',
    'token'       => 'invalid token',
    'fileSize'    => 'filesize not match',
    'fileExt'     => 'extensions to upload is not allowed',
    'fileMime'    => 'mimetype to upload is not allowed',
];

我也沒一個一個試額。

驗證器有了,接下來就要使用了哈,嗯,文件中叫驗證情景,不對,是場景:

我是在user控制器中驗證,所以我寫在控制器中:

$validate = Loader::validate('User');
if(!$validate->check($data)){
    dump($validate->getError());
}else{
    dump($data);
}

載入自定義好的驗證器,然後使用check()方法。對傳入的資料進行驗證。失敗則獲取error,成功則輸出!

當然,tp5提供一個例項化驗證器的助手函式:

$validate = validate("User");

我不喜歡用助手函式,不過功能實現就好。

不使用驗證器,直接在場景使用時定義規則,就是獨立驗證。

在例項化validate物件的時候,傳入你定義的規則即可,也可以使用rule()方法定義。寫法不同罷了。

同樣,上面所用的採用'|'來新增多個規則的寫法,也可以改為陣列的方法,陣列無處不在。。。

如果要改變提示資訊,也可以在驗證器中自定義:

<?php
namespace app\admin\validate;

use think\Validate;

class User extends Validate{
    protected $rule = [
        'user_name'  => 'require|max:20',
        'password'  => 'require',
        'real_name'  => 'require|max:12',
        'email' => 'email',
        'qq'    => 'number|max:20',
        'phone'    => 'require|length:11|number',
    ];

    protected $message  =   [
        'user_name.require' => '名稱必須',
        'user_name.max'     => '名稱最多不能超過25個字元',
        'qq.number'   => 'qq必須是數字',
        'phone.number'   => '手機必須是數字',
        'phone.max'   => '請輸入11位手機號',
        'email'        => '郵箱格式錯誤',
    ];

}

控制器中使用批量驗證的話,我木有試額,批量驗證不通過返回的是一個錯誤陣列:

  1. $validate = new Validate($rule, $msg);
  2. $result = $validate->batch()->check($data);

上面一直使用的是框架自帶的規則,定義驗證規則:

1、使用了驗證器的話,只要在類中,定義函式

'user_name'  => 'require|max:20|checkName:xinghua',

自定義一個checkName規則:

// 自定義驗證規則
protected function checkName($value,$rule,$data){
    return $rule == $value ? true : '名稱必須是xinghua';
}

定義的規則名不能和已有的衝突哦;

2、沒使用驗證器的話,採用extend()方法定義

$validate->extend('checkName', function ($value, $rule) {

 return $rule == $value ? true : '名稱錯誤';

});

還支援批量註冊規則,同樣是使用陣列。

定義欄位資訊,可以給對應的欄位新增描述:

protected $field = [
    'user_name'  => '使用者名稱',
    'password'  => '密碼',
    'real_name'  => '姓名',
    'email' => '郵箱',
    'qq'    => 'QQ',
    'phone'    => '手機'
];

在使用場景中,直接定義欄位,來限制當前驗證的欄位。

在驗證器中定義$scene:

protected $scene = [
    'register' => ['user_name','real_name','password','phone','email'],
];

場景使用時,就需要加上scene()方法:

$validate->scene('register')->check($data)

顯然,我沒把qq欄位寫進去,設定的qq驗證規則木有生效。

在scene裡還可以重寫規則,

protected $scene = [

'edit' => ['name','age'=>'require|number|between:1,120'],

];

動態設定的話採用匿名函式:$validate->scene('edit', function($key,$data){

return 'email'==$key && isset($data['id'])? true : false;

});

END;