每个控制器方法都手动调一遍验证器,写着累,还容易漏。用全局中间件统一处理,改一处全站生效。
为什么要写这个?
主要是为了添加数据或者修改数据的时候验证用,但是每次手动调用验证器又觉得太重复了,就选择写一个全局中间件自动去验证添加或者修改的内容
中间件的好处:个人理解,中间件不需要调用,它在你加载页面或者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
本文由 admin 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。