Yii2基础版不修改源码而完美实现验证码刷新
默认情况下,Yii2生成的验证码都是固定不变的,即使刷新页面也不会改变。网上的大多数解决方法都是通过修改vendor/yiisoft/yii2/captcha/CaptchaAction.php中的代码来解决。但是在实际的项目中,我们能不修改源码就尽量不要修改,以免出现不可预知的问题。下面就介绍不通过修改源码而实现验证码刷新的方法。
1、在controller目录下新建MyCaptcha.php文件
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use yii\web\Response;
class MyCaptcha extends \yii\captcha\CaptchaAction
{
/**
* 继承并重写CaptchaAction中的run()方法
* 实现验证码刷新功能
*/
public function run()
{
$this->setHttpHeaders();
\Yii::$app->response->format = Response::FORMAT_RAW;
return $this->renderImage($this->getVerifyCode(true)); // 添加true,使得验证码可以刷新
}
}
2、在控制器中添加actions方法
/**
* actions的作用主要是共用功能相同的方法
* 当用户访问test/captcha时,actions就会调用yii\captcha\CaptchaAction方法
*/
public function actions()
{
return [
'captcha' => [
// 'class' => 'yii\captcha\CaptchaAction', // 默认用法
'class' => 'app\controllers\MyCaptcha', // 继承自MyCaptcha.php,使得不需要修改源码就能实现验证码刷新
// 背景颜色
'backColor' => 0x000000,
// 最大显示个数
'maxLength' => 4,
// 最少显示个数
'minLength' => 4,
// 验证码字符与框的内边距
'padding' =>2,
// 高度
'height' => 30,
// 宽度
'width' => 60,
// 字体颜色
'foreColor' => 0xffffff,
// 字符间距
'offset' => 1,
],
];
}
OK!其实也很简单,这样我们可以在postman或者浏览器发送请求,然后刷新,看一下验证码会不会变化。
可能有些新手朋友对actions方法不熟悉,所以我把请求的地址结构也写一下:
localhost/test/captcha
localhost就是服务器IP,如果你是在本地测试的,那么就直接是localhost或者127.0.0.1;如果是在网络服务器中测试的,那么就是你网络服务器的地址。
test是我控制器的名称,反正测试用,就随便取的。
captcha是actions中的captcha字段。这里简单说下actions。它的作用是可以存放功能相同的方法,用法和平时其他方法一样。