日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

php验证器的调用,ThinkPHP5 验证器的具体使用

發(fā)布時(shí)間:2025/3/21 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php验证器的调用,ThinkPHP5 验证器的具体使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章主要介紹了關(guān)于ThinkPHP5 驗(yàn)證器的具體使用,有著一定的參考價(jià)值,現(xiàn)在分享給大家,有需要的朋友可以參考一下

前言:

我們?cè)谧鯝PI開發(fā)的時(shí)候,我們會(huì)接受客戶端傳來的參數(shù),大家都知道這個(gè)參數(shù)是不可信的,我們后端開發(fā)人員必須對(duì)這個(gè)參數(shù)進(jìn)行驗(yàn)證。我在之前的開發(fā)中只是知道tp5的驗(yàn)證器,并不知道他的用途,因?yàn)橹暗拈_發(fā)驗(yàn)證,往往都是基于模型字段進(jìn)行的驗(yàn)證。而驗(yàn)證器更適用與API開發(fā),今天就簡單講下驗(yàn)證器的使用

目錄:創(chuàng)建驗(yàn)證器

書寫單獨(dú)驗(yàn)證器

調(diào)用驗(yàn)證

1.創(chuàng)建驗(yàn)證器

首先我們需要一個(gè)文件夾來存放我們的驗(yàn)證器,我們?cè)谀K下創(chuàng)建一個(gè)同控制器平級(jí)的文件夾,取名為validate

然后我們就可以來建立驗(yàn)證器了,我們只需要?jiǎng)?chuàng)建一個(gè)類,繼承tp5的validate類就可以了。

但是熟悉面向?qū)ο笏枷氲呐笥岩欢ㄖ?#xff0c;當(dāng)我們需要一個(gè)方法每個(gè)驗(yàn)證器都要用到,但是又不去修改tp5的源碼時(shí)。我們就多寫一個(gè)類來作為我們的基類。所有的驗(yàn)證器都繼承這個(gè)基類,然后這個(gè)基類再去繼承tp5的validate類。

這里我們把他取名為baseValidate

那么現(xiàn)在再創(chuàng)建一個(gè)正兒八經(jīng)的驗(yàn)證器了。舉個(gè)例子:

namespace app\index\validate;

use think\Validate;

class User extends Validate

{

protected $rule = [

'name' => 'require|max:25',

'email' => 'email',

];

}

再到控制器或者模型中去實(shí)例化再調(diào)用

//虛擬一組數(shù)據(jù),實(shí)際開發(fā)中是接受用戶傳遞的數(shù)據(jù)

$data = [

'name'=>'thinkphp',

'email'=>'thinkphp@qq.com'

];

$validate = Loader::validate('User');

if(!$validate->check($data)){

dump($validate->getError());

}

這樣一個(gè)驗(yàn)證器的應(yīng)用就寫好了。我們來看看有沒有什么可以簡化的地方。首先需要被驗(yàn)證的數(shù)據(jù)是我們從客戶端那接受過來的那么,第一步接受數(shù)據(jù)

然后我們要對(duì)數(shù)據(jù)進(jìn)行驗(yàn)證,如果驗(yàn)證不通過,返回錯(cuò)誤信息

這兩部是每次接口被請(qǐng)求都是要做的。那么我們就想把這個(gè)封裝到BaseValidate中去

namespace app\home\validate;

use think\Exception;

use think\Request;

use think\Validate;

class BaseValidate extends Validate

{

public function goCheck($data='')

{

//實(shí)例化請(qǐng)求對(duì)象

$requestObj=Request::instance();

//如果傳入為空則獲取請(qǐng)求里的參數(shù)

empty($data)&&$data=$requestObj->param();

if ($this->check($data)) {

//如果驗(yàn)證通過了

return true;

}else{

//如果驗(yàn)證沒通過

$error=$this->getError();

//拋出異常

throw new Exception($error);

}

}

}

這個(gè)goCheck方法封裝好后,有人可能會(huì)問,這個(gè)驗(yàn)證規(guī)則在哪里呢?

2. 書寫單獨(dú)驗(yàn)證器

之前有說過BaseValidate是用來被繼承的,那么真正的驗(yàn)證器,我們還沒有開始寫。規(guī)則就制定到這個(gè)驗(yàn)證器中。為了更深入的理解,這里舉例子順便使用了自定義驗(yàn)證 規(guī)則。其實(shí)tp寫好了的驗(yàn)證規(guī)則應(yīng)該很夠用了

我們就拿最常接受的數(shù)據(jù)來舉例子,那就是 id 同常這個(gè)id就代表了我們數(shù)據(jù)庫中某條數(shù)據(jù)的id,這個(gè)id我們往往設(shè)計(jì)為無符號(hào)自動(dòng)遞增的主鍵,翻譯成人話就是正整數(shù)。那么如果客戶傳來的參數(shù)是負(fù)數(shù)或者小數(shù)那么就不應(yīng)該通過驗(yàn)證。

我們根據(jù)上述需求,我們來創(chuàng)建一個(gè)驗(yàn)證器。位置還是跟之前的一樣在validate文件夾下

取名為IdMustBePositiveInt.php(名字有點(diǎn)長,不過好在望文知意)

首先肯定是要繼承我們的基礎(chǔ)驗(yàn)證器

class IdMustBePositiveInt extends BaseValidate

然后制定規(guī)則,為一個(gè)固定的成員變量賦值

protected $rule = [

//require是內(nèi)置規(guī)則,而tp5并沒有正整數(shù)的規(guī)則,所以下面這個(gè)positiveInt使用自定義的規(guī)則

'id' => 'require|positiveInt'

];

那么自定義規(guī)則怎么干呢,其實(shí)也簡單。定義一個(gè)被保護(hù)的方法

//系統(tǒng)會(huì)自動(dòng)傳入幾個(gè)參數(shù) 第一個(gè)是 要驗(yàn)證的值,第二個(gè)是規(guī)則,自己可以規(guī)定規(guī)則內(nèi)容或者不寫,第三個(gè)是最初傳入的data。其實(shí)不只這三個(gè)參數(shù),想了解詳細(xì)的可以看看文檔

protected function positiveInt($value, $rule='', $data)

{

if (is_int(($value+0))&&($value+0)>0) {

return true;

}else{

return 'id必須為正整數(shù)';

}

}

!!注意:這里如果判斷失敗:返回的不是false 返回的是錯(cuò)誤信息。

3. 調(diào)用驗(yàn)證

根據(jù)我們之前的封裝,我們需要達(dá)到的效果就是接受參數(shù),驗(yàn)證參數(shù)一體。那么現(xiàn)在我們?nèi)绾握{(diào)用驗(yàn)證呢

厲害的來了,我們還是以id為例

public function test($id)

{

//在控制器中直接調(diào)用寫上這行代碼就搞定驗(yàn)證了

(new IdMustBePositiveInt)->goCheck();

}

就這樣的一句代碼,直接搞定驗(yàn)證。當(dāng)我們實(shí)例化id驗(yàn)證器,調(diào)用它父類的goCheck方法。

goCheck方法會(huì)接受參數(shù),并且將參數(shù)傳入validate對(duì)象上check方法

就會(huì)去匹配我們?cè)趇d驗(yàn)證器中$rule中規(guī)定的require規(guī)則和我們自定義的規(guī)則。

如果都通過就會(huì)返回true

如果其中一條不匹配則會(huì)拋出異常

這次只舉了id為例子,雖然看上去比直接寫?yīng)毩Ⅱ?yàn)證麻煩很多,但是大家仔細(xì)想想,這個(gè)驗(yàn)證規(guī)則其實(shí)在很多地方都是一樣的,比如密碼驗(yàn)證規(guī)則,用戶名驗(yàn)證規(guī)則等,當(dāng)這個(gè)項(xiàng)目寫完了。你已經(jīng)完成了很多驗(yàn)證器。其實(shí)在下個(gè)項(xiàng)目中還可以繼續(xù)套用的哦

TP5驗(yàn)證規(guī)則使用

①靜態(tài)調(diào)用(使用內(nèi)置的規(guī)則驗(yàn)證單個(gè)數(shù)據(jù),返回值為布爾值)

// 日期格式驗(yàn)證

Validate::dateFormat('2016-03-09','Y-m-d'); // true

// 驗(yàn)證是否有效的日期

Validate::is('2016-06-03','date'); // true

// 驗(yàn)證是否有效郵箱地址

Validate::is('thinkphp@qq.com','email'); // true

// 驗(yàn)證是否在某個(gè)范圍

Validate::in('a',['a','b','c']); // true

// 驗(yàn)證是否大于某個(gè)值

Validate::gt(10,8); // true

// 正則驗(yàn)證

Validate::regex(100,'\d+'); // true

②模型驗(yàn)證(在模型中的驗(yàn)證方式)

$User = new User;

$result = $User->validate(

[

'name' => 'require|max:25',

'email' => 'email',

],

[

'name.require' => '名稱必須',

'name.max' => '名稱最多不能超過25個(gè)字符',

'email' => '郵箱格式錯(cuò)誤',

]

)->save($data);

if(false === $result){

// 驗(yàn)證失敗 輸出錯(cuò)誤信息

dump($User->getError());

}

③控制器驗(yàn)證(控制器中進(jìn)行驗(yàn)證)

如果你需要在控制器中進(jìn)行驗(yàn)證,并且繼承了\think\Controller的話,可以調(diào)用控制器類提供的validate方法進(jìn)行驗(yàn)證,如下:

$result = $this->validate(

[

'name' => 'thinkphp',

'email' => 'thinkphp@qq.com',

],

[

'name' => 'require|max:25',

'email' => 'email',

]);

if(true !== $result){

// 驗(yàn)證失敗 輸出錯(cuò)誤信息

dump($result);

}

控制器中的驗(yàn)證代碼可以簡化為:

$result = $this->validate($data,'User');

if(true !== $result){

// 驗(yàn)證失敗 輸出錯(cuò)誤信息

dump($result);

}

如果要使用場(chǎng)景,可以使用:

$result = $this->validate($data,'User.edit');

if(true !== $result){

// 驗(yàn)證失敗 輸出錯(cuò)誤信息

dump($result);

}

在validate方法中還支持做一些前置的操作回調(diào),使用方式如下:

$result = $this->validate($data,'User.edit',[],[$this,'some']);

if(true !== $result){

// 驗(yàn)證失敗 輸出錯(cuò)誤信息

dump($result);

}

好了,本次tp5驗(yàn)證器的介紹了就寫到這里了,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)推薦:

總結(jié)

以上是生活随笔為你收集整理的php验证器的调用,ThinkPHP5 验证器的具体使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。