YII2中验证码的使用

验证码的使用是比较频繁的。YII2中已经帮我们做好了封装。

首先我们在控制器里创建一个actions方法,用于使用yii\captcha\CaptchaAction

<?php

namespace app\controllers;

use YII;
use yii\web\Controller;

class IndexController extends Controller
{
    public function actionIndex()
    {
        if (YII::$app->request->isPost) {
            //获取post过来的验证码
            $verify = YII::$app->request->post('verify');

            //我们手动进行验证,第二个参数表示是否区分大小写
            if ($this->createAction('captcha')->validate($verify,false)) {
                echo '成功';
            } else {
                echo '失败';
            }

        } else {
            return $this->renderPartial('index');
        }
    }

    //actions的作用主要是共用功能相同的方法
    //当用户访问index/captcha时,actions就会调用yii\captcha\CaptchaAction方法
    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction','fixedVerifyCode' => null,//背景颜色
                'backColor' => 0x000000,//最大显示个数
                'maxLength' => 4,//最少显示个数
                'minLength' => 4,//间距
                'padding' => 2,//高度
                'height' => 30,//宽度
                'width' => 85,//字体颜色
                'foreColor' => 0xffffff,//设置字符偏移量
                'offset' => 4,],];
    }
}

显示页面代码如下:

<?php
use yii\helpers\Url;
use yii\helpers\Html;
?>
<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>分页显示</title>
</head>
<body>
    <form action="<?php echo Url::toRoute('index/index'); ?>" method="post">
        验证码:<input type="text" name="verify"><br>
        <img id="verifyImg" src="<?php echo Url::toRoute('index/captcha'); ?>"><br>
        <input type="submit" value="提交">
        <input name="_csrf" type="hidden" value="<?php echo \Yii::$app->request->csrfToken; ?>">
    </form>

    <?php echo Html::jsFile('@web/js/jquery-3.3.1.min.js'); ?>
    <script type="text/javascript">
        $(function () {
            //处理点击刷新验证码
            $("#verifyImg").on("click",function () {
                $.get("<?php echo Url::toRoute('index/captcha') ?>?refresh",function (data) {
                    $("#verifyImg").attr("src",data["url"]);
                },"json");
            });
        });
    </script>
</body>
</html>

演示结果如下:

上面控制器中验证码的验证方式是我们手动的。我们也可以创建一个模型配置rules()来自动完成。

<?php

namespace app\models;

use yii\base\Model;

class VerifyForm extends Model
{

    //变量名为你表单中输入验证码控件的name
    public $verify;

    public function rules()
    {
        return [
            ['verify','required','message' => '请填写验证码'],//注意captchaAction的设置,指向你显示验证码的action,这里我们的是index/captcha
            ['verify','captcha','captchaAction' => 'index/captcha','caseSensitive' => false,'message' => '验证码错误'],];
    }
}

控制器代码修改如下:

<?php

namespace app\controllers;

use YII;
use app\models\VerifyForm;
use yii\web\Controller;

class IndexController extends Controller
{
    public function actionIndex()
    {
        if (YII::$app->request->isPost) {
            $verify = new VerifyForm();
            $verify->load(YII::$app->request->post(),'');

            //自动验证
            if ($verify->validate()) {
                echo '成功';
            } else {
                var_dump($verify->errors);
            }

        } else {
            return $this->renderPartial('index');
        }
    }

    //actions的作用主要是共用功能相同的方法
    //当用户访问index/captcha时,actions就会调用yii\captcha\CaptchaAction方法
    public function actions()
    {
        return [
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',];
    }
}

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1、将Yii2.0advanced版中应用主体frontend或backend应用复制为api应用2、在应用主体api目录的controller新建SiteController.php:namespaceapi\controllers;useYii;useyii\rest\ActiveController;/*SiteController测试控制器*/classSiteControllerextendsActiveCon
Yii2restfulAPI文档一、配置模块:1.Config/main.php:  2.创建模块目录:  3.Module.php:  二、路由配置:  三、控制器:  四、Models:   五、测试:GET:  POST:  PUT:      DELETE:  
Yii在framework/i18n/data/%lang%.php文件中有很多翻译.这是例如germantranslations我想在我的Yii项目中使用Fullcalendar.要翻译此日历,我必须为当前语言提供一个monthNames/dayNames数组.FullcalendarmonthNamesDocumentationYii生成数组的最佳方法是什么:['January'
在Yii2中,官方的页面多语言解决方案有两个:方案1,使用Yii::t()函数,在页面中需要输出文字的地方,使用类似如下代码:<?=Yii::t(‘views/login’,‘hello’)?>这样做的后果是页面上大量充斥着类似的代码,导致页面可读性很差,而且对于同一个页面来说,Yii::t()函数的第一个参数基本上都是
Yii2.0对数据库查询的一些简单的操作123456789101112131415161718192021222324252627282930313233343536373839User::findOne($id);   //此方法返回 主键 id=1  的一条数据(举个例子);  User::find()->where(['name' =
数据查询User::find()->all();此方法返回所有数据;User::findOne($id);此方法返回主键id=1的一条数据(举个例子);User::find()->where(['name'=>'小伙儿'])->one();此方法返回['name'=>'小伙儿']的一条数据;User::find()->where(['n
最近打算提升自己的解决问题能力,于是打算从学习其他框架下手,让我们先去了解yii框架是如何运作的吧!https://www.yiichina.com/访问yii中文网站  让我们先把框架下载下来点击下载框架 科普一下:目前yii框架有三个版本yii1.0、yii1.1、yii2.0貌似即将推出3.0 这里我们
如何在Yii2中检查模型属性的类型(列类型)?ThisoldYiiForumanswer给了我一个结论,在Yii1中我可以使用类似的东西:$model->getMetaData()->columns['attribute-name']->type;但我没有成功将此解决方案移植到Yii2.有人可以帮忙吗?解决方法:您可以使用:$model->getTableSchema()
defined('YII_DEBUG')ordefine('YII_DEBUG',true);defined('YII_ENV')ordefine('YII_ENV','dev');require(__DIR__.'/../vendor/autoload.php');//注册类加载器require(__DIR__.'/../vendor/yii
在NGINX中配置:location/{   if(!-e$request_filename){    rewrite^/(.*)/index.phplast;}这样,当NGINX找不到文件的时候,就会将URL重写为index.php。对于URL中只有域名的情况,因为不存在对应的文件,所以会匹配到。再配置:location~\.php${  include
Yii2.0封装的类足够强大,Mailer的使用方法做一个总结:1、先在main-local.php中做好配置:return[//....'components'=>['mailer'=>['class'=>'yii\swiftmailer\Mailer',],],];详细如下:return[//....'components'=>[
每当我尝试登录我的Yii应用程序时,它都会显示错误CDbConnectionfailedtoopentheDBconnection:couldnotfinddriver.我google了很多个小时,从许多博客我知道我需要pdo_mysql,但已经安装了.在php.ini中我也对这些行做了评论;extension=php_pdo_mysql.dll;extension
我有一个模型Aziende,它与称为Annunci的花药模型相关(1:N),如下所示:'annunci'=>array(self::HAS_MANY,'Annunci','azienda_id'),我想算一下有多少记录确实有这种关系,在mySql中我会做:SELECTcount(*)FROM`aziende`aJOINannuncianONan.azienda_id=a.id我怎么能
我们有一个项目,为孟加拉国最大的服装行业之一建立一个ERP系统.他们有大约20,000名员工,其中约10%的员工每个月都会离职.我们是一家拥有5名PHP开发人员的小公司,对这么大的项目没有多少经验.我们之前使用Codeigniter/ZendFramework和MySQL数据库开发了不同的中小规模项目.对于
我在Yii中有一些表单,使用以下内容以下拉形式从相关表中获取数据列表:dropDownList(CHtml::listData(Company::model()->findAll(array('order'=>'companyASC'))));这是有效的,但这意味着对于每个下拉列表(其中很多)我将这个数组(‘order’=>’公司ASC’放在每一个中.这是最
本文采用Yii文档,经过自己的修改,让读者更容易理解预定义完整列表: boolean : CBooleanValidator 的别名,确保属性的值是CBooleanValidator::trueValue 或CBooleanValidator::falseValue .captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来
前面已经安装好了yii框架,现在我们来建立第一个Yii应用1、进入您网站更目录2、执行命令:YiiRoot/framework/yiicwebapptestdrive说明:这里的YiiRoot为您Yii框架的安装目录。3、输入以上命令后,会出现一个提示信息:PHPWarning:PHPStartup:Unabletol
一、ThinkPHPThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。ThinkPHP的宗旨是简化开发、提
我必须实现标题中提到的验证,即需要两个字段之一(电子邮件,电话).我在我的模型中这样做:[['email'],'either',['other'=>['phone']]],这是方法:publicfunctioneither($attribute_name,$params){$field1=$this->getAttributeLabel($attribute_nam
我试图得到(StatusCode)响应RESTapi,而它只返回字段名称和错误消息,如下所示[{"field":"Email","message":"Email\"ali@ali.ali\"hasalreadybeentaken."}]我添加了回复'response'=>['class'=>'