🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
验证规则支持对表单的令牌验证 **方法1:** 首先需要在你的表单里面增加下面隐藏域: ~~~ <form> ... <input type="hidden" name="__token__" value="{$Request.token}" /> </form> //如果你的令牌名称不是`__token__`,则表单需要改为: <form> <input type="hidden" name="__hash__" value="{$Request.token.__hash__}" /> <form> ~~~ 然后在你的验证规则中,添加`token`验证规则即可,例如,如果使用的是验证器的话,可以改为: ~~~ protected $rule = [ 'name' => 'require|max:25|token', 'email' => 'email', ]; ~~~ **方法2:** 表单里面增加下面隐藏域: ``` <form> ... {:token()} </form> //如果你的令牌名称不是`__token__`,则表单需要改为: <form> {:token('__hash__')} <form> ``` 验证器中需要改为: ~~~ protected $rule = [ 'name' => 'require|max:25|token:__hash__', 'email' => 'email', ]; ~~~ **自定义令牌生成规则** 如果需要自定义令牌生成规则,可以调用`Request`类的`token`方法,例如: ~~~ namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { $token = $this->request->token('__token__', 'sha1'); $this->assign('token', $token); return $this->fetch(); } } ~~~ 然后在模板表单中使用: ~~~ <input type="hidden" name="__token__" value="{$token}" /> ~~~ 或者不需要在控制器写任何代码,直接在模板中使用: ~~~ {:token('__token__', 'sha1')} ~~~ ## **实例:** 前台页面 ~~~ <form action="{:url('addFormData')}" method="post"> <input type="text" name="name" value="thinkphp"> <input type="text" name="email" value="thinkphp@qq.com"> <input type="text" name="zip" value="888888"> <input type="text" name="age" value="20"> <input type="text" name="status" value="2"> {:token('__token__', 'sha1')} <input type="submit" value="提交"> </form> ~~~ 控制器: ~~~ <?php namespace app\index\controller; use think\Controller; class Test extends Controller{ public function index() { return $this->fetch('index@/Test/index'); } public function addFormData(\think\Request $request) { $name=$request->post('name'); $email=$request->post('email'); $zip=$request->post('zip'); $age=$request->post('age'); $status=$request->post('status'); $token=$request->post('__token__'); $data = [ 'name'=>$name, 'email'=>$email, 'zip'=>$zip, 'age'=>$age, 'status'=>$status, '__token__'=>$token ]; $validate = \think\Loader::validate('test');//or $validate = validate('test'); //实例化后还可以动态添加规则 他将合并到Test验证rule属性里 $validate->rule([ 'zip' => '/^\d{6}$/', 'status'=> 'number|between:0,2' ]); //实例化后还可以动态添加错误信息 他将合并到Test验证$message属性里 $validate->message([ 'zip'=>'邮编格式不正确', 'status.between'=>'状态超出取值范围', 'status.number'=>'状态数据类型错误', ]); //实例化后可以动态添加自定义的验证字段描述 $validate->addField([ 'zip'=>'邮编', 'status'=>'状态', ]); if(!$validate->check($data)){ dump($validate->getError()); } } } ~~~ 验证器: ~~~ <?php namespace app\index\validate; use think\Validate; class Test extends Validate { //定义验证规则 |和数组都可以 protected $rule = [ 'name' => 'require|max:25', 'email' => 'email', 'age' => ['number','between'=>'1,120'], '__token__'=>'token' ]; //定义错误信息 protected $message = [ 'name.require' => '名称必须', 'name.max' => '名称最多不能超过25个字符', 'age.number' => '年龄必须是数字', 'age.between' => '年龄只能在1-120之间', 'email' => '邮箱格式错误', ]; //定义验证字段描述 protected $field=[ 'name' => '名称', 'age' => '年龄', 'email' => '邮箱', ]; //定义场景(后面根数组是重新定义规则) protected $scene = [ 'edit' => ['name','email','age'=>'require|number|between:1,120'], ]; /** * 自定义动态添加验证字段描述 */ public function addField($name,$field='') { if (is_array($name)) { $this->field = array_merge($this->field, $name); } else { $this->field[$name] = $field; } return $this; } } ~~~ 当前台表单提交后,便无法再次提交,每次提交,都会出现“请勿重复提交”提示,无论输入的数是否改变,所以,可以在前端页面用js刷新页面`window.location.reload();` 原理参看扩展-自定义表单令牌章节