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

posted @ 2020-05-26 10:19  原来是个帅小伙  阅读(4597)  评论(0编辑  收藏  举报