tp6 使用全局中間件配置驗證器


為什么要寫這個?

主要是為了添加數據或者修改數據的時候驗證用,但是每次手動調用驗證器又覺得太重復了,就選擇寫一個全局中間件自動去驗證添加或者修改的內容

中間件的好處:個人理解,中間件不需要調用,它在你加載頁面或者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方法是檢查存放驗證規則的路徑是否有這個文件,你可以根據自己的需求來改路徑

注意不要放錯路徑額

 

轉載請標注出處額  https://www.cnblogs.com/luojie-/p/12963872.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM