中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用ThinkPHP5 驗證器

發布時間:2021-05-17 16:49:59 來源:億速云 閱讀:134 作者:Leah 欄目:開發技術

這篇文章給大家介紹如何使用ThinkPHP5 驗證器,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1.創建驗證器

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

如何使用ThinkPHP5 驗證器

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

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

這里我們把他取名為baseValidate

如何使用ThinkPHP5 驗證器

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

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文件夾下

如何使用ThinkPHP5 驗證器

取名為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();
  }
  1. 就這樣的一句代碼,直接搞定驗證。當我們實例化id驗證器,調用它父類的goCheck方法。

  2. goCheck方法會接受參數,并且將參數傳入validate對象上check方法

  3. 就會去匹配我們在id驗證器中$rule中規定的require規則和我們自定義的規則。

  4. 如果都通過就會返回true

  5. 如果其中一條不匹配則會拋出異常

這次只舉了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);
}

關于如何使用ThinkPHP5 驗證器就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿荣旗| 古蔺县| 博乐市| 原阳县| 县级市| 思茅市| 望城县| 额尔古纳市| 桃园县| 淄博市| 萨迦县| 昌黎县| 南溪县| 玉溪市| 都兰县| 盐山县| 河间市| 二连浩特市| 旌德县| 资溪县| 宜兴市| 义乌市| 襄汾县| 屏南县| 姜堰市| 松原市| 秀山| 来宾市| 昌邑市| 郓城县| 汤原县| 岢岚县| 会同县| 龙江县| 揭西县| 大连市| 琼海市| 留坝县| 抚远县| 孝昌县| 石阡县|