Yii2.x 中captcha 验证码使用的一些心得 [ 技术分享 ]
首先对应控制器中定义captcha,对应模型中声明captcha变量。
 public function actions() {
        return [
            'captcha' =>  [
                'class' => 'yii\captcha\CaptchaAction',
                'height' => 50,
                'width' => 80,
                'minLength' => 4,
                'maxLength' => 4
            ],
        ];
    }
设置一些简单属性,也可以不设。
对应视图中添加表单:
  <?= $form->field($user_login,'captcha')->widget(yii\captcha\Captcha::className()
                                        ,['captchaAction'=>'user/captcha',
                                        'imageOptions'=>['alt'=>'点击换图','title'=>'点击换图', 'style'=>'cursor:pointer']]);?>
captchaAction 指定captcha所在的控制器路径,默认是‘site/captcha’,不换到指定位置的话,很容易,验证码就显示不出来。
imageOptions设定一些参数,例如 手势,提示等等。
对应布局中,如下:以确保你在点击验证码可以自动刷新
<?php $this->beginPage() ?>
<?php $this->beginBody() ?>
    //your codes...
<?= $contents; ?>
    //your codes...
<?php $this->endBody() ?>
<?php $this->endPage() ?>
最后,控制器中调用render而非renderPartial:
return $this->render('login',['user_login'=>$user_login]);
共 9 条回复
- 
 - 

不是bug,看了源码之后,要求再次请求才会刷新认证码,以下为我写的 js
//刷新验证码 function refreshCaptcha(_captcha){ $.getJSON("/site/captcha?refresh=true",function(res){ var dataUrl = _captcha.attr("data-url"); if(!dataUrl){ dataUrl = _captcha.attr("src"); _captcha.attr("data-url",dataUrl); } _captcha.attr("src",dataUrl+"?rd="+Math.random()); }); }ghost50 觉得很赞 - 
 - 
 - 

最好是自己继承一下,再修改
namespace app\actions; // 改成自己的名称空间 class CaptchaAction extends yii\captcha\CaptchaAction { public $autoRegenerate = true; public function run() { if ($this->autoRegenerate && Yii::$app->request->getQueryParam(self::REFRESH_GET_VAR) === null) { $this->setHttpHeaders(); Yii::$app->response->format = Response::FORMAT_RAW; return $this->renderImage($this->getVerifyCode(true)); } return parent::run(); } } - 
 - 
 - 
 - 
 
amrozhou
            注册时间:2015-02-25
最后登录:2021-06-03
在线时长:96小时32分
    最后登录:2021-06-03
在线时长:96小时32分
- 粉丝26
 - 金钱32351
 - 威望40
 - 积分33711