Thinkphp5基礎——11 validate驗證

TimChen666發表於2019-01-18

前言

Validate可以對引數進行驗證,方便我們攔截惡意引數。

Validate有兩種主要用法:獨立驗證驗證器




驗證器

首先,總覽一下使用驗證器的步驟。

步驟:

1)新建一個類,繼承think\Validate。

2)該類有一個固定的protected屬性rule

如果是自定義的規則的話,可以在類裡面使用protected function定義一個函式進行指定。

這個函式的引數按照順序分別是:驗證資料、驗證規則、全部資料(陣列)、欄位名、欄位描述。


3)該類有一個固定的protected屬性message,可以規定返回的錯誤資訊,key是欄位名,值是內容。

4)引入這個類,例項化。

5)使用batch( )處理批量資料校驗。

6)使用check( )方法校驗是否符合規則。

7)使用getError( )方法獲取錯誤資訊。

例項

Count.php(驗證類檔案)


namespace app\api\validate;

class Count
{
	// 欄位校驗規則
	protected $rule = [
	  'count' => 'isPostiveInteger|between:1,15',
	  ....
	];

	// 錯誤提示資訊
	protected $message = [
	  'count' => 'count必須是在1~15之間',
	  ...
	];
	
	// 自定義驗證規則
	protected function isPostiveInteger($value,$rule='',$data='',$field=''){
		if(is_numeric($value) && is_int($value + 0) && ($value + 0) > 0){
		  return true;
		}else{
		  return false;
		}
	}
}


Goods.php(呼叫驗證類的檔案)

use app\api\validate\Count;

class Goods
{
	$data = [
	  'count' => '111',
	  ...
	];
	
	$validate = new Count();
	
	$validate->batch()->check($data);
	if (!$validate) {
	  dump($validate->getError());
	}
}





獨立驗證

獨立驗證和驗證器最大的區別是它的驗證規則、錯誤提示資訊是直接寫在上文的。


$validate = new Validate([
    'name'  => 'require|max:25',
    'email' => 'email'
]);

$data = [
    'name'  => 'thinkphp',
    'email' => 'thinkphp@qq.com'
];

if (!$validate->check($data)) {
    dump($validate->getError());
}



構建Validate驗證層


BaseValidate類

1)建立一個BaseValidate類,繼承think\Validate。

2)BaseValidate類有一個goCheck方法,可以呼叫check方法檢測引數是否符合規則。其實就是封裝了一下原來的check方法。


對應的validate類

1)新建對應的validate類,繼承BaseValidate類。

2)該類有一個固定的protected屬性rule。
如果是自定義的規則的話,可以在類裡面使用protected function定義一個函式進行指定。

3)還有一個固定的protected屬性rule,可以指定錯誤資訊。


Model層

例項化對應的validate類,呼叫goCheck()方法校驗。



一起來看看簡單的例子:

BaseValidate類


// 統一驗證()方法
public function goCheck(){

	// 1.引數
	$params = input('param.');
        
	// 2.校驗引數是否合規
	$result = $this->batch()->check($params);

	// 3.不符合就丟擲異常
	if(!$result){
		$e = new ParameterException([
		  'msg'  => $this->error  // 來自於validate類
		]);
		throw $e;
		
	}else{
	  return true;
	}
}


對應的validate類

class AppTokenGet extends BaseValidate
{
	// 欄位校驗規則
	protected $rule = [
	  'ac' => 'require|isNotEmpty',
	  'se' => 'require|isNotEmpty'
	];

}

控制器檔案


$validate = new AppTokenGet ();

$validate->goCheck();

相關文章