Yii2 自带的验证码 captcha 填坑记录 [ 新手入门 ]
昨天开始用 Yii2 做一个项目,需要用到图形验证码。
配置控制器行为
模型配置
我这里使用的客户端验证,服务器端验证关闭
if (!$this->validate(['username','password'])) { //指定验证字段,不验证verifyCode字段
return null;
}
视图引用
视图文件中引用类 Captcha
use yii\captcha\Captcha;
form中开启客户端验证
<?php $form = ActiveForm::begin(['id' => 'form-signup','enableClientValidation'=>true]); ?>
引用验证码控件
<?= $form->field($model, 'verifyCode')->widget(
Captcha::className(),
[
'captchaAction'=>'site/captcha',
'imageOptions' => [ 'class' => "captcha"],
'options' => ['placeholder' => '请输入验证码'],
]
)
?>
配置完成,我天真的以为这就 OK 了,刷新页面测试,不管你输入是否正确都报“验证码错误”。
经过一下午各种调试代码,最终才发现是session中根本没有验证码。
于是按照以下方法修改 yii\captcha\CaptchaAction
的源码:
这一步配置完,发现虽然有验证码,但是页面上显示的始终跟session中的对不上,于是:
最终效果:
到此,验证码就 OK 了。
注意:
- 这里是直接修改的Yii的源码,实际应用中最好自己写一个验证码类,继承CaptchaAction并且重写上面对应的方法。
- 另外如果需要在后台进行验证码验证,就在表单中关闭客户端验证,后端validate放行验证规则就行了。
- 具体为什么要这么改,我也不知道,有什么问题的话,请提出来,大家相互学习。
共 3 条回复
-
如果需要前后端同时验证的话,像这样修改:
public function validate($input, $caseSensitive) { $code = $this->getVerifyCode(false); $valid = $caseSensitive ? ($input === $code) : strcasecmp($input, $code) === 0; $session = Yii::$app->session; $session->open(); $name = $this->getSessionKey() . 'count'; $session->set($name ,$session->get($name) + 1); if ($valid || $session->get($name) > $this->testLimit && $this->testLimit > 0) { $this->getVerifyCode(true); } return $valid; }
共 1 条回复
Abna
注册时间:2017-10-27
最后登录:2019-09-08
在线时长:5小时4分
最后登录:2019-09-08
在线时长:5小时4分
- 粉丝0
- 金钱125
- 威望0
- 积分175