[TOC]
# 简介
![](https://box.kancloud.cn/b6a39caa72acd737c9b320b3c0b355b7_1144x1192.png)
![](https://box.kancloud.cn/b81a161698231bfc275397be95b9139d_946x740.png)
![](https://box.kancloud.cn/5ebc810523d37752029ee4b8e1e2efe0_1316x1420.png)
![](https://box.kancloud.cn/ecbd3e1d8bacdc74daf6e8f47dc5512e_1430x1168.png)
![](https://box.kancloud.cn/84a15888b626eccfe937a387ef408d72_1112x1122.png)
![](https://box.kancloud.cn/dcf87ded9fa96ef4761cbd7dce22d54c_1344x1358.png)
# api
## 第一步:显示验证码图片
控制器要配置一个action映射,将显示验证码图片的网址映射给[yii\\captcha\\CaptchaAction](http://www.yiichina.com/doc/api/2.0/yii-captcha-captchaaction)
为了快速上手,请你**一定要在Site控制器下进行映射!**
~~~php
class SiteController extends \yii\web\Controller{
public function actions(){
return [
//默认情况下一定要命名为 captcha,后面再教你改
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'width' => 220, //宽高
'height' => 70,
'padding' => '0', //内边距
'transparent' => true, //透明底
'backColor' => 0x000000, //背景色
'foreColor' => 0xFFFFFF, //文字色
],
];
}
}
~~~
这样就能实现访问`?r=site/captcha`的时候能看到一张验证码图片,而这张图片就是[yii\\captcha\\CaptchaAction::run](http://www.yiichina.com/doc/api/2.0/yii-captcha-captchaaction#run()-detail)输出的
实际上这个地址每被访问一次的时候,Yii除了生成验证码图片显示出来之余,它还在session里存好了验证码的值,以便我们未来提交上去时能比较是否输入正确
* * *
## 第二步:设定前端的输入表单
我这里以自定义的表单演示:
~~~php
<form method="post" action="/index.php?r=site/login">
<!--下面加onclick是为了实现点击刷新-->
<img src="/index.php?r=site/captcha" /><br/>
<input type="text" placeholder="请输入验证码" name="verifyCode" /><br/>
<button type="submit">提交</button>
</form>
~~~
* * *
## 第三步:定义一个表单模型
验证规则的名称就是`captcha`
~~~php
class LoginForm extends \yii\base\Model{
public function rules(){
return [
['captcha', 'captcha', 'message' => '验证码错误'],
];
}
}
~~~
* * *
## 第四步:控制器调用
~~~php
//这个login方法先放Site控制器吧,其实无所谓
public function actionLogin(){
$form = new LoginForm();
$form->load(Yii::$app->request->post(), '');
if($form->validate()){
echo '验证码正确';
}else{
echo current($form->firstErrors); //验证码错误
}
}
~~~
* * *
## 刷新验证码
### 错误的做法
如果将上面的img标签改成`<img src="/index.php?r=site/captcha" onclick="this.src=/index.php?r=site/captcha&v=随机数" />`这样的话即使是加了随机数,但点击后重新加载的验证码都是一模一样不会变化的,不信你直接在浏览器上访问[http://localhost/index.php?r=site/captcha&v=111](http://localhost/index.php?r=site/captcha&v=111)然后再访问[http://localhost/index.php?r=site/captcha&v=222](http://localhost/index.php?r=site/captcha&v=222),都会是同一张图片
### 正确的做法
要实现刷新验证码先要通过ajax获取一个不同的验证码地址:
~~~js
$.get('/index.php?r=site/captcha&refresh=1', function(result){
//这就是新的验证码地址,类似 /index.php?r=site%2Fcaptcha&v=58e8de5c89096
console.log(result.url);
});
~~~
注意这里ajax请求的地址多了个参数叫`refresh`,值为1
ajax成功得到这个新的url后,将它设置到img的src属性里就可以更新验证码图片了
* * *
## 示例代码下载
[http://pan.baidu.com/s/1i5Fo5lb](http://pan.baidu.com/s/1i5Fo5lb)
这个示例并没有使用**site/captcha**这个路由来产生验证码,而是使用了**abc/xxx**
在这种情况下(非site/captcha)要在表单模型**rules**里定义规则时多加一个`captchaAction`才能成功校验,未来我会发表文章专门讲讲这个
- 目录
- 配置
- 简介
- 别名
- gii
- 配置项
- 模型
- 简介
- 增删改查
- AR和model
- 模型事件
- 场景
- query查询
- 增删改
- AR查询器
- 模型关系定义
- AR模型连表查询
- fields
- where拼接
- 模块
- 创建模块
- 控制器
- 表单
- 跳转
- 响应
- 验证器
- Action
- 组件
- url
- 分页
- 验证码
- 缓存
- 文件上传
- 预启动组件
- 事件
- 自定义组件
- redis
- 日志
- 行为
- cookie和session
- 基础知识
- 创建一个类
- 配置一个类
- object基类
- component组件类特性
- phpstorm无法更改php等级
- url地址美化
- 过滤器
- 请求处理
- 请求组件
- 响应组件
- header
- 用户登录
- 实现IdentityInterface接口
- 登录
- 自动检测登录
- 获取用户信息
- 访问行为追踪
- phpstorm+postman断点调试