首頁  >  文章  >  後端開發  >  ThinkPHP5 驗證器的具體使用

ThinkPHP5 驗證器的具體使用

不言
不言原創
2018-05-31 15:34:123001瀏覽

這篇文章主要介紹了關於ThinkPHP5 驗證器的具體使用,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

前言:

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

目錄:

  1. ##建立驗證器

  2. 書寫單獨驗證器

  3. 呼叫驗證

#1.建立驗證器

首先我們需要一個資料夾來存放我們的驗證器,我們在模組下建立一個同控制器平級的資料夾,取名為validate

#然後我們就可以來建立驗證器了,我們只需要建立一個類,繼承tp5的validate類別就可以了。

但是熟悉物件導向思想的朋友一定知道,當我們需要一個方法每個驗證器都要用到,但是又不去修改tp5的原始碼時。我們就多寫一個類別來作為我們的基底類別。所有的驗證器都繼承這個基底類,然後這個基底類再去繼承tp5的validate類別。

這裡我們把他取名為baseValidate


那麼現在再建立一個正兒八經的驗證器了。舉個例子:

namespace app\index\validate;

use think\Validate;

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

}

到控制器或模型中去實例化再呼叫


//虚拟一组数据,实际开发中是接受用户传递的数据
$data = [
  'name'=>'thinkphp',
  'email'=>'thinkphp@qq.com'
];

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

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

這樣一個驗證器的應用程式就寫好了。讓我們來看看有沒有什麼可以簡化的地方。

  1. 首先需要被驗證的資料是我們從客戶端那接受過來的那麼,第一步接受資料

  2. 然後我們要對資料進行驗證,如果驗證不通過,回傳錯誤訊息

這兩部是每次介面被要求都是要做的。那我們就想把這個封裝到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();
    //如果传入为空则获取请求里的参数
    empty($data)&&$data=$requestObj->param();
    if ($this->check($data)) {
      //如果验证通过了
      return true;
    }else{
      //如果验证没通过
      $error=$this->getError();
      //抛出异常
      throw new Exception($error);
    }
  }
}

這個goCheck方法封裝好後,有人可能會問,這個驗證規則在哪裡呢?

2. 書寫單獨驗證器

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

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


我們根據上述需求,我們來建立一個驗證器。位置還是跟之前的一樣在validate資料夾下

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

#首先肯定是要繼承我們的基礎驗證器


class IdMustBePositiveInt extends BaseValidate

#然後制定規則,為一個固定的成員變數賦值


  protected $rule = [
  //require是内置规则,而tp5并没有正整数的规则,所以下面这个positiveInt使用自定义的规则
    'id' => 'require|positiveInt'
  ];

那麼自訂規則怎麼幹呢,其實也簡單。定義一個被保護的方法


//系统会自动传入几个参数 第一个是 要验证的值,第二个是规则,自己可以规定规则内容或者不写,第三个是最初传入的data。其实不只这三个参数,想了解详细的可以看看文档
 protected function positiveInt($value, $rule='', $data)
  {
    if (is_int(($value+0))&&($value+0)>0) {
      return true;
    }else{
      return 'id必须为正整数';
    }
  }

! !注意:這裡如果判斷失敗:回傳的不是false 回傳的是錯誤訊息。


3. 呼叫驗證

#根據我們先前的封裝,我們需要達到的效果就是接受參數,驗證參數一體。那現在我們要如何呼叫驗證呢

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


 public function test($id)
  {
    //在控制器中直接调用写上这行代码就搞定验证了
    (new IdMustBePositiveInt)->goCheck();
  }

    ##就這樣的一句程式碼,直接搞定驗證。當我們實例化id驗證器,呼叫它父類別的goCheck方法。
  1. goCheck方法會接受參數,並且將參數傳入validate物件上check方法
  2. 就會去匹配我們在id驗證器中$rule中規定的require規則和我們自訂的規則。
  3. 如果都通過就會回傳true
  4. 如果其中一條不符合則會拋出例外

这次只举了id为例子,虽然看上去比直接写独立验证麻烦很多,但是大家仔细想想,这个验证规则其实在很多地方都是一样的,比如密码验证规则,用户名验证规则等,当这个项目写完了。你已经完成了很多验证器。其实在下个项目中还可以继续套用的哦

TP5验证规则使用

①静态调用(使用内置的规则验证单个数据,返回值为布尔值)

// 日期格式验证
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的话,可以调用控制器类提供的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方法中还支持做一些前置的操作回调,使用方式如下:

$result = $this->validate($data,'User.edit',[],[$this,'some']);
if(true !== $result){
  // 验证失败 输出错误信息
  dump($result);
}

好了,本次tp5验证器的介绍了就写到这里了,希望对大家的学习有所帮助。

相关推荐:

ThinkPHP5.0框架控制器继承基与自定义类案例详解

Thinkphp5 前置操作详解

以上是ThinkPHP5 驗證器的具體使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn