Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式
短信验证码在目前大多数web应用中都会有,本文介绍一个基于Yii2 Validator方式的验证码验证方式。
在其他文章中看到的方式大多比较难做到一次封装,多次重用。
使用此方式的好处自然不用多说,Validator支持在Model和Form中使用,使用的时候只需要在rules中添加一条验证规则即可。 第一步: 准备数据表,用来存储短信验证码 CREATE TABLE `tbl_sms_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`to` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
`usage` varchar(20) NOT NULL DEFAULT '' COMMENT '用途',
`code` varchar(6) DEFAULT NULL COMMENT '验证码',
`result` varchar(80) DEFAULT '' COMMENT '发送结果',
`error_code` varchar(255) DEFAULT '' COMMENT '错误码',
`error_msg` varchar(255) DEFAULT '' COMMENT '错误信息',
`used` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否使用',
`use_time` int(11) DEFAULT '0' COMMENT '使用时间',
`create_time` int(11) DEFAULT '0' COMMENT '发送时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=66 DEFAULT CHARSET=utf8;
表结构可根据项目实际场景进行细节调整。
创建好数据表之后, 再使用Gii生成对应的Model类app\models\SmsLog 第二步: 创建短信验证码验证器, app\validators\SmscodeValidator namespace app\validators; use app\models\SmsLog;
use yii\validators\Validator; /**
* 短信验证码验证器
* Class SmscodeValidator
*/
class SmscodeValidator extends Validator
{
/**
* 对应Smslog表中的usage字段,用来匹配不同用途的验证码
* @var string sms code type
*/
public $usage;
/**
* Model或者form中提交的手机号字段名称
* @var string
*/
public $phoneAttribute = 'cellphone';
/**
* 验证码过期时间
* @var int
*/
public $expireTime = 10800; /**
* @param \yii\base\Model $model
* @param string $attribute
*/
public function validateAttribute($model, $attribute)
{
$fieldName = $this->phoneAttribute;
$cellPhone = $model->$fieldName; $smsLog = SmsLog::find()->where([
'to' => $cellPhone,
'usage' => $this->usage
])->orderBy('create_time DESC')->one(); /** @var $smsLog SmsLog */
$time = time();
if(
is_null($smsLog) ||
($smsLog->code != $model->$attribute) ||
($smsLog->create_time > $time || $time > ($smsLog->create_time + $this->expireTime) )
) {
$this->addError($model, $attribute,'验证码有误');
}else{
$smsLog->used = 1;
$smsLog->use_time = $time;
$smsLog->save();
}
} } 第三步: 使用方法, 在Model或者Form中添加Rules 例如, 在用户注册使用,前端通过ajax请求后台向指定手机号,发送了验证码
在验证的时候只需要添加一条rule:
['verifyCode', '\app\validators\SmscodeValidator', 'usage' => 'userRegister' ], 完整的rule,可以覆盖SmscodeValidator中的三个属性的值
['verifyCode', '\app\validators\SmscodeValidator', 'usage' => 'userRegister', 'phoneAttribute' => '手机号字段名称', 'expireTime' => '短信验证码有效时间' ], RegisterForm.php namespace mobile\models; use yii; class RegisterForm extends AjaxForm
{
const VERCODE_USAGE = 'userRegister';
public $cellphone;
public $verifyCode;
public $password; public function rules()
{
return [
[['cellphone', 'verifyCode', 'password'], 'required'],
['verifyCode', '\common\validators\SmscodeValidator', 'usage' => self::VERCODE_USAGE ],
['password' , 'string', 'min' => 6, 'max' => 32], ['cellphone', 'filter', 'filter' => 'trim'],
['cellphone', 'match', 'pattern'=>'/^1[34578][0-9]{9}$/','message'=>'请输入正确的手机号'],
['cellphone', 'unique', 'targetClass' => '\mobile\models\User', 'message' => '此手机号已经被注册'],
];
} /**
* 用户注册
* @return User|null
*/
public function register()
{
if($this->validate()) {
$user = new User();
$user->cellphone = $this->cellphone;
$user->username = $this->cellphone;
$user->setPassword($this->password);
$user->cellphone_verified = 1;
$user->create_from = Yii::$app->id;
$user->create_ip = Yii::$app->request->getUserIP();
$user->create_time = time();
if($user->save()) {
return $user;
}
}
return null;
} public function attributeLabels()
{
return [
'truename' => '真实姓名',
'cellphone' => '手机号码',
'verifyCode' => '验证码',
'password' => '密码',
'repassword' => '确认密码'
];
}
} 当然, 首先你得利用自己的方式(比如,前端点击form中按钮,利用Ajax请求后台发送验证码)发送验证码。
本文的主要目的是能让大家能够通过一条rule快捷实现短信验证的目的。
Yii2在Form中处理短信验证码的Validator,耦合度最低的短信验证码验证方式的更多相关文章
- iOS中打电话、打开网址、发邮件、发短信等
常用小功能 小功能简介 iOS中的很多小功能都是非常简单的,几行代码就搞定了,比如打电话.打开网址.发邮件.发短信等 打电话-方法1 最简单最直接的方式:直接跳到拨号界面 NSURL *url = [ ...
- C#调用SMS短信接口,轻松搞定发送短信的任务。。。。
首先我们需要去这里http://sms.webchinese.cn/申请一个账号和短信接口秘钥,在该网址下有许多语言的demo介绍,下面我主要为大家贴一个C#中的Helper类: using Syst ...
- ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...
- VB短信猫开发包,支持超长短信
一.短信猫开发包(长短信/异步调用)说明: 短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...
- form中button特殊功能
描述:写弹窗的时候发现,form中的button,不对它进行什么设置,它会有默认的操作,点击“发送验证码”或者“提交申请”,它都会退出弹窗(取消遮罩层) 解决:button有不同的type属性,只需要 ...
- ligerui_实际项目_003:form中添加数据,表格(grid)里面显示,最后将表格(grid)里的数据提交到servlet
实现效果: "Form"中填写数据,向本页"Grid"中添加数据,转换成Json数据提交,计算总和,Grid文本框可编辑,排序 图片效果: 总结: //disp ...
- 为Form中的控件增加自适应功能 转
创建一个基于Custom的类resizeable,并新建属性和方法程序,其说明如下: a) 新建属性: posiTyperList 可调整位置的控件类型列表sizeTypeList 可调整大小的控件类 ...
- HTML 之 Web页面表单form中只有一个input的text元素,按回车默认提交
WEB开发中,如果页面的 form 中只有一个input元素,在该input元素的输入框中按回车(注:此时并没有写对应的onkeydown等事件处理),则浏览器会默认提交表单,请看如下代码: < ...
- Oracle Developer Form中Block的重新查询
Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询,但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如 ...
随机推荐
- Java中 如何把Object类型强转成Map<String, String>类型
首先你需要保证要转换的Object的实际类型是Map<String, String> 假设Object变量名为obj,强制转换(Map<String, String>)obj ...
- 阿里云安装 virtio 驱动
为避免部分服务器.虚拟机或者云主机的操作系统在阿里云控制台 导入镜像 后,使用该自定义镜像创建的 ECS 实例无法启动,您需要在导入镜像前检查是否需要在源服务器中安装 Xen(pv)或 virtio ...
- 02:Sysbench基准压测(oltp_update_index.lua、oltp_update_non_index.lua)my.cnf
目录 Sysbench 基准压测 my.cnf 一.Sysench测试前准备 1.1.压测环境 二.进行OLTP_update测试 2.1.安装压测工具sysbench 2.2.执行压测 三.执行结果 ...
- Mysql--产品支持的平台
- 硬盘IOPS与读写速度
IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一.IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求 ...
- 数据库DRDS中间件介绍
DRDS/TDDL alibaba. Distributed Relational Database Service. 阿里分布式数据库DRDS的前身是淘宝分布式数据库层TDDL,大概在2012年的时 ...
- 移动终端App测试点归纳
以下所有测试最后必须在真机上完整的执行. 1 安装.卸载测试 1.1 在真机上.第三方软件(xy苹果助手.91.安卓助手)的安装与卸载 1.2 安装在手机卡上 或 SD卡上 (不同的IOS和安卓版本) ...
- 如何在Oracle中向Collection类型的变量中逐条插入数据
这篇文章将要介绍如果需要生成一个新的Collection并且向其中添加数据的方法. procedure insert_object(d in dept_array, d2 out dept_array ...
- js函数——倒计时模块和无缝滚动
倒计时 效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- nginx 1.12 配置解析php
server { listen 80; server_name foo.com; root /path; index index.html index.htm index.php; location ...