- 首先我們在控制器裡建一個 base.php 基類
- 然後我們引入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["參數名"];
}
}