zoukankan      html  css  js  c++  java
  • tp6 使用全局中间件配置验证器

    为什么要写这个?

    主要是为了添加数据或者修改数据的时候验证用,但是每次手动调用验证器又觉得太重复了,就选择写一个全局中间件自动去验证添加或者修改的内容

    中间件的好处:个人理解,中间件不需要调用,它在你加载页面或者add或者edit的时候会自动加载,这个时候如果你写了验证方法或者登陆验证,他就或自动判断,如果失败就会返回到你给定的地址或者提示的内容

    首先文件结构:

    middleware.php 内容:

    <?php
    // 全局中间件定义文件
    return [
        // 全局请求缓存
        // 	hinkmiddlewareCheckRequestCache::class,
        // 多语言加载
        // 	hinkmiddlewareLoadLangPack::class,
        // Session初始化
         	hinkmiddlewareSessionInit::class,
    
       //全局中间件文件的加载路径 appmiddlewareCheckValidate
    ::class, ];

    然后我们在应用下面生成一个 验证器文件  :tp6前叫模块 ,6之后叫应用

     

     验证规则大家可以看文档生成,我就简单的贴一下我的

    Index.php 内容:

    <?php
    declare (strict_types = 1);
    
    //Index 验证器
    // +----------------------------------------------------------------------
    // |
    // +----------------------------------------------------------------------
    
    namespace appadminvalidatedev;
    
    use thinkValidate;
    
    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 appmiddleware;
    class CheckValidate
    {
        use appcommon	raitsJumpTrait;
        /**
         * 处理请求
         *
         * @param 	hinkRequest $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

    人生得意须尽欢,莫使金樽空对月.
  • 相关阅读:
    Linux mint下firefox安装flashplayer
    Linux mint下安装iNode遇到的几个问题
    FireFox浏览器访问ip6域名的问题
    用牛顿迭代法和二分法求方程的根
    VC6工程向导制作
    配置多个版本的python的系统环境变量
    C语言习题解答:求某一天为一年中的第几天
    使用Python求解水仙花问题
    Python语言中round函数的一个疑惑
    Linux下安卓手机管理软件QtADB的使用
  • 原文地址:https://www.cnblogs.com/luojie-/p/12963872.html
Copyright © 2011-2022 走看看