天天看點

使用tp5的 Validate 過濾參數

  • 首先我們在控制器裡建一個 base.php 基類
    使用tp5的 Validate 過濾參數
  • 然後我們引入Controller Validate Request 這些類,之後讓他去繼承 Controller
  • 下來我們定義一些屬性,這裡說一下 $rules
  • 一層 Index 是控制器下 子產品名稱
  • 二層 index 是 子產品裡的 方法名稱
  • 三層的 page sv|搜尋值,都為該方法裡從前端接收的 參數名稱,它對應的值就是我們想要對參數做的驗證
<?php
namespace app\index\controller;
use think\Controller;
use think\Validate;
use think\Request;

class Base extends Controller{
    protected $req; //用來處理用戶端傳遞過來的參數
    protected $validater; //用來驗證資料/參數
    protected $params; //過濾後符合要求的參數
   
    //控制器下面方法所要接受參數的
    protected $rules = array(
        'Index' => array(
            'index' => array(
                'page' => ['alphaNum'],
                'sv|搜尋值' => ['alphaDash'],
            ),
            'welcome'=> array(),
            'cannot_find'=> array()
        ), 
        
    );
//構造函數 用來進行資料初始化
    public function __construct(){
		parent::__construct();//父類初始化
        $this->req = Request::instance();
        //3. 驗證參數,傳回成功過濾後的參數數組
        $this->params = $this->checkParams($this->req->param(true));
	}	
	
    //檢測用戶端傳遞過來的其他參數(使用者名,其他相關)
    /*
    param: $arr []
    return:     [合格的參數數組]
     */
    protected function  checkParams($arr)
    {
        //1.擷取驗證規則 (Array)
        $controller=$this->req->controller();
        $action=$this->req->action();
        
        $rule = $this->rules[$controller][$action];

        //2. 驗證參數并且傳回錯誤
        $this->validater = new Validate($rule);
        if (!$this->validater->check($arr)) {
             $this->returnMsg(1, $this->validater>getError());      
        }
        //3. 如果正常,就通過驗證
        return $arr;
    }
    /**
     * [ajax回調]
     * @return json
     */
	public function returnMsg($code,$msg = '',$data= []){
    	$return_data['code'] = $code;
        $return_data['msg'] = $msg;
        $return_data['data'] = $data;
       echo json_encode($return_data);die;
    }
}    
           
  • 下來我們再寫一個 checkParams() 方法
  • 方法裡調用 $rule 屬性,來找到我們對目前 控制器 和 方法 規定的 驗證規則
  • 通過驗證就輸出參數,不通過就抛出異常
  • 那麼它是怎麼實作每次都首先驗證參數呢?
  • 在 function __construct(){} 構造函數裡調用 checkParams() 就ok
  • 那别的控制器怎麼接收 驗證後的參數呢?
  • 上面我們把驗證合格的參數 放在了 $this->params裡,我們把目前控制器繼承 base 控制器 就接收到參數了
<?php
namespace app\index\controller;

class Index extends Base{
    public function index() {  
    	$name = $this->params["參數名"];
    }
}