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方法是检查存放验证规则的路径是否有这个文件,你可以根据自己的需求来改路径
注意不要放错路径额
人生得意须尽欢,莫使金樽空对月.