最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ThinkPHP5 驗證器的具體使用

 更新時間:2018年05月31日 14:36:16   作者:勃起狂奔者  
這篇文章主要介紹了ThinkPHP5 驗證器的具體使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言:

我們在做API開發(fā)的時候,我們會接受客戶端傳來的參數(shù),大家都知道這個參數(shù)是不可信的,我們后端開發(fā)人員必須對這個參數(shù)進行驗證。我在之前的開發(fā)中只是知道tp5的驗證器,并不知道他的用途,因為之前的開發(fā)驗證,往往都是基于模型字段進行的驗證。而驗證器更適用與API開發(fā),今天就簡單講下驗證器的使用

目錄:

  1. 創(chuàng)建驗證器
  2. 書寫單獨驗證器
  3. 調(diào)用驗證

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

首先我們需要一個文件夾來存放我們的驗證器,我們在模塊下創(chuàng)建一個同控制器平級的文件夾,取名為validate

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

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

這里我們把他取名為baseValidate

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

namespace app\index\validate;

use think\Validate;

class User extends Validate
{
  protected $rule = [
    'name' => 'require|max:25',
    'email' => 'email',
  ];

}

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

//虛擬一組數(shù)據(jù),實際開發(fā)中是接受用戶傳遞的數(shù)據(jù)
$data = [
  'name'=>'thinkphp',
  'email'=>'thinkphp@qq.com'
];

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

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

這樣一個驗證器的應(yīng)用就寫好了。我們來看看有沒有什么可以簡化的地方。

  1. 首先需要被驗證的數(shù)據(jù)是我們從客戶端那接受過來的那么,第一步接受數(shù)據(jù)
  2. 然后我們要對數(shù)據(jù)進行驗證,如果驗證不通過,返回錯誤信息

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

namespace app\home\validate;
use think\Exception;
use think\Request;
use think\Validate;
class BaseValidate extends Validate
{
  public function goCheck($data='')
  {
    //實例化請求對象
    $requestObj=Request::instance();
    //如果傳入為空則獲取請求里的參數(shù)
    empty($data)&&$data=$requestObj->param();
    if ($this->check($data)) {
      //如果驗證通過了
      return true;
    }else{
      //如果驗證沒通過
      $error=$this->getError();
      //拋出異常
      throw new Exception($error);
    }
  }
}

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

2. 書寫單獨驗證器

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

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

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

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

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

class IdMustBePositiveInt extends BaseValidate

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

  protected $rule = [
  //require是內(nèi)置規(guī)則,而tp5并沒有正整數(shù)的規(guī)則,所以下面這個positiveInt使用自定義的規(guī)則
    'id' => 'require|positiveInt'
  ];

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

//系統(tǒng)會自動傳入幾個參數(shù) 第一個是 要驗證的值,第二個是規(guī)則,自己可以規(guī)定規(guī)則內(nèi)容或者不寫,第三個是最初傳入的data。其實不只這三個參數(shù),想了解詳細的可以看看文檔
 protected function positiveInt($value, $rule='', $data)
  {
    if (is_int(($value+0))&&($value+0)>0) {
      return true;
    }else{
      return 'id必須為正整數(shù)';
    }
  }

??!注意:這里如果判斷失?。悍祷氐牟皇莊alse 返回的是錯誤信息。

3. 調(diào)用驗證

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

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

 public function test($id)
  {
    //在控制器中直接調(diào)用寫上這行代碼就搞定驗證了
    (new IdMustBePositiveInt)->goCheck();
  }
  1. 就這樣的一句代碼,直接搞定驗證。當我們實例化id驗證器,調(diào)用它父類的goCheck方法。
  2. goCheck方法會接受參數(shù),并且將參數(shù)傳入validate對象上check方法
  3. 就會去匹配我們在id驗證器中$rule中規(guī)定的require規(guī)則和我們自定義的規(guī)則。
  4. 如果都通過就會返回true
  5. 如果其中一條不匹配則會拋出異常

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

TP5驗證規(guī)則使用

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

// 日期格式驗證
Validate::dateFormat('2016-03-09','Y-m-d'); // true
// 驗證是否有效的日期
Validate::is('2016-06-03','date'); // true
// 驗證是否有效郵箱地址
Validate::is('thinkphp@qq.com','email'); // true
// 驗證是否在某個范圍
Validate::in('a',['a','b','c']); // true
// 驗證是否大于某個值
Validate::gt(10,8); // true
// 正則驗證
Validate::regex(100,'\d+'); // true

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

$User = new User;
$result = $User->validate(
  [
    'name' => 'require|max:25',
    'email'  => 'email',
  ],
  [
    'name.require' => '名稱必須',
    'name.max'   => '名稱最多不能超過25個字符',
    'email'    => '郵箱格式錯誤',
  ]
)->save($data);
if(false === $result){
  // 驗證失敗 輸出錯誤信息
  dump($User->getError());
}

③控制器驗證(控制器中進行驗證)

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

$result = $this->validate(
  [
    'name' => 'thinkphp',
    'email' => 'thinkphp@qq.com',
  ],
  [
    'name' => 'require|max:25',
    'email'  => 'email',
  ]);
if(true !== $result){
  // 驗證失敗 輸出錯誤信息
  dump($result);
}

控制器中的驗證代碼可以簡化為:

$result = $this->validate($data,'User');
if(true !== $result){
  // 驗證失敗 輸出錯誤信息
  dump($result);
}

如果要使用場景,可以使用:

$result = $this->validate($data,'User.edit');
if(true !== $result){
  // 驗證失敗 輸出錯誤信息
  dump($result);
}

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

$result = $this->validate($data,'User.edit',[],[$this,'some']);
if(true !== $result){
  // 驗證失敗 輸出錯誤信息
  dump($result);
}

好了,本次tp5驗證器的介紹了就寫到這里了,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • PHP實現(xiàn)的封裝驗證碼類詳解

    PHP實現(xiàn)的封裝驗證碼類詳解

    本篇文章是對PHP實現(xiàn)的封裝驗證碼類進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • php數(shù)組中刪除元素之重新索引的方法

    php數(shù)組中刪除元素之重新索引的方法

    在某個數(shù)組中刪除一個元素,可以直接用的unset,那么怎么才能做到缺少的元素會被填補并且數(shù)組會被重新索引呢,下文會為大家揭曉
    2014-09-09
  • php中文語義分析實現(xiàn)方法示例

    php中文語義分析實現(xiàn)方法示例

    這篇文章主要介紹了php中文語義分析實現(xiàn)方法,結(jié)合實例形式分析了PHP基于BosonNLP擴展實現(xiàn)中文語義分析的具體操作步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-09-09
  • PHP的AES加密算法完整實例

    PHP的AES加密算法完整實例

    這篇文章主要介紹了PHP的AES加密算法,結(jié)合完整實例形式分析了php的AES加密算法類及其具體用法,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • php PDO實現(xiàn)的事務(wù)回滾示例

    php PDO實現(xiàn)的事務(wù)回滾示例

    這篇文章主要介紹了php PDO實現(xiàn)的事務(wù)回滾功能,結(jié)合具體實例形式分析了php基于PDO操作實現(xiàn)事務(wù)回滾功能的相關(guān)SQL語句與操作技巧,需要的朋友可以參考下
    2017-03-03
  • PHP實現(xiàn)生成帶背景的圖形驗證碼功能

    PHP實現(xiàn)生成帶背景的圖形驗證碼功能

    這篇文章主要介紹了PHP實現(xiàn)生成帶背景的圖形驗證碼功能,結(jié)合實例形式詳細分析了php生成帶背景的圖形驗證碼操作相關(guān)步驟與操作技巧,需要的朋友可以參考下
    2016-10-10
  • Windows下PHP開發(fā)環(huán)境搭建教程(Apache+PHP+MySQL)

    Windows下PHP開發(fā)環(huán)境搭建教程(Apache+PHP+MySQL)

    這篇文章主要為大家詳細介紹了Windows下PHP開發(fā)環(huán)境搭建教程:Apache+PHP+MySQL,具有一定的實用性和參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • PHP SPL使用方法和他的威力

    PHP SPL使用方法和他的威力

    什么是SPL,如何使用,他有什么作用,下面我我們就講講PHP SPL的用法
    2013-11-11
  • 使用 MySQL Date/Time 類型

    使用 MySQL Date/Time 類型

    上次對于 MySQL 方面已經(jīng)有的一些總結(jié),但是昨晚 wiLdGoose 兄說他也碰到同樣的問題,但是無法解決。結(jié)果經(jīng)過種種的假設(shè)和判斷以后,到最后發(fā)現(xiàn)原來是 Zend Studio 的時區(qū)配置問題(我狂汗ing)。而在和他討論期間也談到了很多關(guān)于 MySQL 的細節(jié)問題,還是記錄一下當作備忘比較好。這篇文章同時也做說服 wiLdGoose 兄用。
    2008-03-03
  • 為你總結(jié)一些php系統(tǒng)類函數(shù)

    為你總結(jié)一些php系統(tǒng)類函數(shù)

    這篇文章是小編為大家總結(jié)的一些php系統(tǒng)類函數(shù),很實用,需要的朋友千萬不要錯過。
    2015-10-10

最新評論

马公市| 隆尧县| 吉首市| 遂溪县| 通河县| 敦煌市| 武宣县| 甘南县| 陇川县| 来凤县| 海城市| 库尔勒市| 霍山县| 乾安县| 高淳县| 福清市| 临猗县| 乳源| 锡林浩特市| 邳州市| 东乡县| 濉溪县| 新安县| 曲靖市| 新源县| 岑巩县| 视频| 呈贡县| 巴彦淖尔市| 浪卡子县| 石门县| 保德县| 景泰县| 竹山县| 昆山市| 遵化市| 抚顺市| 抚远县| 项城市| 礼泉县| 彭山县|