最近接触到thinkphp6的RC3版本,验证码都搞了我好长一段时间。
1、关于这个版本验证码的配置,官方文档中详细说明了,如果使用扩展内置的方法进行验证码显示,直接在应用的config
目录下面的captcha.php
文件(没有则首先创建)中进行设置即可,以下设置方式仅限于独立调用Captcha类的时候使用。所以我在config下自己创建了一个配置文件,需要的配置可参照文档自行配置:
配置完成后,在页面输出代码如下:
这里需要说明一下,有时候可能不能出现验证码图片,此时请在谷歌调试模式下查看验证码图片的生成路径,也可以将此路径粘贴于浏览器中进行访问,可以查看哪一步出现错误,我这里因为路径的问题,一开始并没有显示出来,于是我自己手动修改了源文件 think-captcha/helper.php中的captcha_img方法,下面圈出来的地方即为修改的地方:
2、关于验证,因为tp6的这个版本默认是不开启session的,所以需要我们自己开启,不然验证的时候是取不到session的。这里说明一下,如果是部分文件需要session,那么就在需要使用的控制器中单独引入(如下),这里我所有文件都需要引入,打开app/middleware.php文件,将\think\middleware\SessionInit::class 注释去掉就可以了
use think\facade\Session;
use think\middleware\SessionInit;
3、2022-10-23日补充:线上的验证码一直用的好好的,昨天更新了一个插件,不晓得是动到哪根命脉了,死活不显示,时间匆忙,等不及找错,于是我参考官网换了一种写法
//控制器创建方法
<?php
namespace app\admin\controller;
use think\captcha\facade\Captcha; //引入它
class Login
{
//创建验证码
public function zcaptcha()
{
$captcha = new Captcha();
return $captcha::create();
}
//登录验证
public function loginCheck()
{
$input = Request::param();
//数据验证
$validate = new Validate;
$validate->rule([
'username|用户名' => 'require',
'password|密码' => 'require',
'captcha|验证码' => 'require'
]);
//验证码的验证
$captcha = new Captcha();
if(!$captcha::check($input['captcha'])){
return json(['info'=>'验证码错误','status'=>0]);
}
if(!$validate->check($input)){
//打印错误规则,并返回页面
return json(['info'=>$validate->getError(),'status'=>0]);
}
//......
}
}
?>
//html界面
<!-- 其他的省略 -->
<input type="text" name="captcha" lay-verify="required" placeholder="验证码(点击图片换一张)" class="layui-input" style="width:210px;float:left;">
<div style="float:left;margin:3px;"><img src="{:url('login/zcaptcha')}" alt="captcha" id="captcha" onclick="changeCaptcha()" /></div>
//js
<script type="text/javascript">
//更新验证码
function changeCaptcha(){
var src = "{:url('login/zcaptcha')}?a=" + Math.random();
$("#captcha").attr('src',src); //更新图片
}
//提交表单
layui.use('form', function(){
var form = layui.form;
//监听提交
form.on('submit(login)', function(data){
$.ajax({
type: "post",
data: data.field,
url: "xxxxxxxxxxxxxxxxx",
dataType: "json",
asyn: false,
success:function(res){
if(res.status == 1){
layer.msg(res.info,{time:1000,icon:6,end:function(){
window.location.href = res.url;
}});
}else{
layer.msg(res.info,{icon:5});
changeCaptcha(); //这里一旦有错误输出就刷新一次验证码
return false;
}
},error:function(request){
layer.msg('系统错误',{icon:5});
changeCaptcha(); //这里一旦有错误输出就刷新一次验证码
return false;
}
});
return false; //阻止表单跳转
});
});
</script>