為什么要寫這個?
主要是為了添加數據或者修改數據的時候驗證用,但是每次手動調用驗證器又覺得太重復了,就選擇寫一個全局中間件自動去驗證添加或者修改的內容
中間件的好處:個人理解,中間件不需要調用,它在你加載頁面或者add或者edit的時候會自動加載,這個時候如果你寫了驗證方法或者登陸驗證,他就或自動判斷,如果失敗就會返回到你給定的地址或者提示的內容
首先文件結構:
middleware.php 內容:
<?php // 全局中間件定義文件 return [ // 全局請求緩存 // \think\middleware\CheckRequestCache::class, // 多語言加載 // \think\middleware\LoadLangPack::class, // Session初始化 \think\middleware\SessionInit::class,
//全局中間件文件的加載路徑 app\middleware\CheckValidate::class, ];
然后我們在應用下面生成一個 驗證器文件 :tp6前叫模塊 ,6之后叫應用
驗證規則大家可以看文檔生成,我就簡單的貼一下我的
Index.php 內容:
<?php declare (strict_types = 1); //Index 驗證器 // +---------------------------------------------------------------------- // | // +---------------------------------------------------------------------- namespace app\admin\validate\dev; use think\Validate; class Index extends Validate { /** * 定義驗證規則 * 格式:'字段名' => ['規則1','規則2'...] * * @var array */ protected $rule = [ 'name' => 'require', 'pid' => 'require', ]; /** * 定義錯誤信息 * 格式:'字段名.規則名' => '錯誤信息' * * @var array */ protected $message = [ 'name.require' => '部門名稱必填', 'pid.require' => '上級部門必填', ]; /** * 驗證場景 * 格式:'場景' => ['字段1','字段2'...] * * @var array */ protected $scene = [ 'add' => ['name','pid'], 'edit' => ['name','pid'], ]; }
現在是CheckValidate.php 的內容,也是最主要的內容:
<?php declare (strict_types=1); namespace app\middleware; class CheckValidate { use \app\common\traits\JumpTrait; /** * 處理請求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { if ($request->isAjax()) { //獲取當前參數 $params = $request->param(); if(!empty($params)){ //獲取url並轉為數組 $arr = $this->url_to_array($params); if(!$arr){ return $next($request); } //檢查url是否滿足驗證條件 $newcontroller = explode('_', $arr[2]); if(count($newcontroller) <= 1 ){ return $next($request); } //檢查驗證文件是否存在 $validate = $this->exists_validate($newcontroller, $arr[1]); if(empty($validate)){ return $next($request); } $results = $this->validate_data($arr[3], $validate, $params); if($results){ return $this->error($results); } } } return $next($request); } /** * 驗證數據 * @param $action * @param $validate * @param $params * @return bool */ public function validate_data($action, $validate, $params) { $scene = ''; if(strstr($action,'add')){ $scene = 'add'; } if(strstr($action,'edit')){ $scene = 'edit'; } if(empty($scene)){ return false; } $v = new $validate; if ($v->hasScene($scene)) { //設置當前驗證場景 $v->scene($scene); if (!$v->check($params)) { //校驗不通過則直接返回錯誤信息 return $v->getError(); }else{ return false; } } } /** * 檢查文件是否存在 * @param null $validate * @return bool|string */ public function exists_validate($validate, $model) { $mokuai = $model."\\"; $file = "app\\".$mokuai."validate\\" .$validate[0]."\\". ucfirst($validate[1]); if(class_exists($file)){ return $file; } return false; } /** * url 轉數組 * @param $data * @return array|null */ public function url_to_array($data) { $arr = null; foreach ($data as $k=> $v){ $arr = explode('/', $k); break; } return $arr; } }
這里面的 exists_validate方法是檢查存放驗證規則的路徑是否有這個文件,你可以根據自己的需求來改路徑
注意不要放錯路徑額