重構(gòu) tp5 參數(shù)校驗(yàn)層

ps:斜體加粗字體為重構(gòu)的每一個(gè)過程

例如我們現(xiàn)在 tp5 項(xiàng)目中有一個(gè)名為 Banner 的控制器。里面有一個(gè)需要傳入 $id 的 getBanner 操作“奔。現(xiàn)在需要對參數(shù) $id 進(jìn)行正整數(shù)校驗(yàn)谁榜,直白的做法馬上就會(huì)映入我們的腦海应役,以下為偽代碼:

public function getBanner($id){
  $data = [
    'id' => $id
  ];
  $validate = new Validate(
    [
      'id' => 'positive integer'
    ]);
  $result = $validate->batch()->check($data);
  if($result){
    // parameter is right and do something;
  } else {
    // error;
  }
}

這樣做確實(shí)沒有任何問題荒给,但是缺點(diǎn)也很明顯秋柄,如果是有多個(gè)參數(shù)呢庸队,或者別的控制器也需要進(jìn)行正整數(shù) $id 檢驗(yàn)怎么辦积蜻?這樣直白的做法實(shí)際上給我們今后的參數(shù)檢驗(yàn)會(huì)埋下坑。
有的人可能會(huì)采取用函數(shù)封裝一下的方式彻消,到時(shí)候進(jìn)行調(diào)用竿拆。但這也不是最優(yōu)的方法。

我們現(xiàn)在來一步一步的做一下宾尚,先寫一個(gè)驗(yàn)證器丙笋,進(jìn)行第一步封裝
我們在 controller 的同級目錄下新建一個(gè) validate 目錄煌贴。在里面新建一個(gè)名為 IDMustBePositiveInt 的 php class御板。

<? php
namespace app\api\validate;

use think\Validate;

class IDMustBePositiveInt extends Validate{
  protected $rule = [
    'id' => 'require|isPositiveInteger'
  ];

  protected function isPositiveInteger($value,$rule='',
                                 $data='',$field=''){
    if(is_numeric($value) && is_int($value + 0) && ($value + 0) > 0){
      return true;
    } else {
      return $field.'必須是正整數(shù)';
    }
  }
}

require 是 tp5 內(nèi)置的驗(yàn)證規(guī)則,isPositiveInteger 是我們自定義的驗(yàn)證規(guī)則牛郑。
現(xiàn)在我們來看一下 Banner 控制器如何調(diào)用這個(gè)驗(yàn)證器怠肋。
進(jìn)行改寫 getBanner 方法:

public function getBanner($id){
  $data = [
    'id' => $id
  ];
  $validate = new IDMustBePositiveInt();
  $result = $validate->batch()->check($data);
  if($result){
    // parameter is right and do something;
  } else {
    // error;
  }
}

但是細(xì)心的人肯定會(huì)發(fā)現(xiàn),我們把獨(dú)立驗(yàn)證的方式改成驗(yàn)證器的方式后淹朋,我們整個(gè)代碼的邏輯并沒有真正的改變笙各,我們之前所提到的問題還是存在的:整個(gè)校驗(yàn)器的方法很長钉答,而且代碼的復(fù)用性不高。
那我們該如何簡化呢杈抢?
先來看一下我們的最終結(jié)果:

public function getBanner($id){
  (new IDMustBePositiveInt())->goCheck()
}

我們最終的目的是僅通過這一行代碼來實(shí)現(xiàn)參數(shù)校驗(yàn)数尿,如果校驗(yàn)成功,則運(yùn)行下面的代碼惶楼,否則報(bào)錯(cuò)并終止運(yùn)行砌创。
而且如果還有別的驗(yàn)證器,僅需要添加一行即可:

(new AnotherValidate())->goCheck()

十分方便鲫懒。
我們現(xiàn)在反推,進(jìn)行下一步重構(gòu)刽辙,構(gòu)建接口參數(shù)校驗(yàn)層
首先我們來實(shí)現(xiàn) goCheck() 方法:
在 validate 文件夾下新建一個(gè) BaseValidate 的 php Class窥岩,所有其他的驗(yàn)證器都繼承于該類,而它則繼承于 think\Validate 類宰缤。

<? php
namespace app\api\validate;

use think\Request;

class BaseValidate extends Validate{
  
  public function goCheck(){
    $request = Request:instance();
    $params= $request->param();
    $result = $this->batch()->check($params);
    if(!result){
      $error = $this->error;
      throw new Exception($error);
    }  else {
       return true;
    }
  }
}

現(xiàn)在我們再回到 getBanner 中颂翼,用我們?nèi)碌乃季S進(jìn)行編寫:

public function getBanner($id){
  (new IDMustBePositiveInt())->goCheck()
}

OK!這一行代碼看起來就像一個(gè)攔截器切面慨灭,如果攔截器通過朦乏,才會(huì)執(zhí)行下面的代碼。
下面是圖示:


AOP思想
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末氧骤,一起剝皮案震驚了整個(gè)濱河市呻疹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筹陵,老刑警劉巖刽锤,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朦佩,居然都是意外死亡并思,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門语稠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宋彼,“玉大人,你說我怎么就攤上這事仙畦∈涮椋” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵议泵,是天一觀的道長占贫。 經(jīng)常有香客問我,道長先口,這世上最難降的妖魔是什么型奥? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任瞳收,我火速辦了婚禮,結(jié)果婚禮上厢汹,老公的妹妹穿的比我還像新娘螟深。我一直安慰自己,他們只是感情好烫葬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布界弧。 她就那樣靜靜地躺著,像睡著了一般搭综。 火紅的嫁衣襯著肌膚如雪垢箕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天兑巾,我揣著相機(jī)與錄音条获,去河邊找鬼。 笑死蒋歌,一個(gè)胖子當(dāng)著我的面吹牛帅掘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播堂油,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼修档,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了府框?” 一聲冷哼從身側(cè)響起吱窝,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寓免,沒想到半個(gè)月后癣诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袜香,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年撕予,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜈首。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡实抡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欢策,到底是詐尸還是另有隱情吆寨,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布踩寇,位于F島的核電站啄清,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俺孙。R本人自食惡果不足惜辣卒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一掷贾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荣茫,春花似錦想帅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咧欣,卻和暖如春浅缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魄咕。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工疗杉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚕礼。 一個(gè)月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像梢什,于是被迫代替她去往敵國和親奠蹬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容