yii2项目实战-用户管理之登陆与注册功能实现

做者:白狼 出处:http://www.manks.top/document/yii2-user.html 本文版权归做者,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。php

上一章节咱们讲述了如何经过新建数据模型来配置yii2的user组件,可是课后有小伙伴发来问卷,为啥在建立user_backend数据表的时候销毁了 password_reset_token 字段呢?其实这个字段对后台管理基本没啥子用,你要是非要,也能够,这里只对该字段以及用途作一个说明,课后须要的能够自行实现。html

该字段具备惟一性,其用途在于用户找回密码。且该字段具备时效性,过时时间参考common\config\params.php文件的user.passwordResetTokenExpire项配置,过时时间默认是1小时。注意哦,默认的找回密码是基于邮件且发送的连接内容包含该字段,用于点击连接跳转后可根据该字段获取到具体用户并实现用户密码的修改。由于看起来仍是蛮繁琐的,若是你没听懂,能够在【小站】​注册一个账号,经过邮件找回密码测试一番。web

所以,考虑到咱们后台,无需这么繁琐,后面咱们增长一个密码重置的功能,让用于自行修改密码便可。bootstrap

说了那么多,咱们接着上一章节,来讲一说如何经过新建的数据表以及user组件来建立一个新的用户,以及如何实现新用户的登陆机制。yii2

其实也是so easy的,跟着步骤走,操做起来简单易学,一学就会,简直不能再6!app

新用户的建立 打开 index.php?r=user-backend 页面,咱们发现有一个建立的按钮,固然,若是咱们真的这么建立了,建立的用户确定是废的,由于确定不能登陆嘛!至少密码咱们这里没有加密吧,对不对?dom

接下来咱们就来实现添加一个新用户的操做,而后一并实现其登录的操做。yii

①、咱们将【建立】的按钮改成【添加新用户】,并修改其对应的连接地址post

<?= Html::a('添加新用户', ['signup'], ['class' => 'btn btn-success']) ?>

能够看到这里咱们命名当前控制器的signup操做为添加新用户的操做,接着咱们就去实现掉这个操做。测试

②、实现signup方法,注意哦,咱们须要实现两步,分别是渲染添加用户的表单和处理表单提交的数据。

/**
 *  create new user
 */
public function actionSignup ()
{
    $model = new \backend\models\SignupForm();

    // 若是是post提交且有对提交的数据校验成功(咱们在SignupForm的signup方法进行了实现)
    // $model->load() 方法,实质是把post过来的数据赋值给model
    // $model->signup() 方法, 是咱们要实现的具体的添加用户操做
    if ($model->load(Yii::$app->request->post()) && $model->signup()) {
        return $this->redirect(['index']);
    }

    // 渲染添加新用户的表单
    return $this->render('signup', [
        'model' => $model,
    ]);
}

③、咱们来看下渲染的表单文件signup.php,默认的视图文件存放在 views/user-backend/ 目录下,能够看到咱们的表单页面是用bootstrap构建的,这样样式问题就不须要担忧了。

<?php


/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model \backend\models\SignupForm */


use yii\helpers\Html;
use yii\bootstrap\ActiveForm;


$this->title = '添加新用户';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="site-signup">
    <div class="row">
        <div class="col-lg-5">
            <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?>

                <?= $form->field($model, 'username')->textInput(['autofocus' => true]) ?>

                <?= $form->field($model, 'email') ?>

                <?= $form->field($model, 'password')->passwordInput() ?>

                <div class="form-group">
                    <?= Html::submitButton('添加', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
                </div>

            <?php ActiveForm::end(); ?>
        </div>
    </div>
</div>

④、从第②、③步来看,咱们紧接着要实现的是Signupform的signup方法,该方法的含义是把接收到的表单数据进行过滤验证而后入库操做。你不可能直接就把用户提交过来的数据直接入库了,比方说邮箱不合法呢?对表单的认证在yii2中操做起来是很是方便的,是须要配置model的rules规则便可。那有些人要问了,个人规则配置好了,何时校验呢?这个很简单,你只须要在数据入库以前调用一下model的validate方法或者save方法(save方法内部会调用validate方法)便可。

<?php
namespace backend\models;
use yii\base\Model;
use backend\models\UserBackend;


/**
 * Signup form
 */
class SignupForm extends Model
{
    public $username;
    public $email;
    public $password;


    /**
     * @inheritdoc
     * 对数据的校验规则
     */
    public function rules()
    {
        return [
            // 对username的值进行两边去空格过滤
            ['username', 'filter', 'filter' => 'trim'],
            
            // required表示必须的,也就是说表单提交过来的值必需要有, message 是username不知足required规则时给的提示消息
            ['username', 'required', 'message' => '用户名不能够为空'],
            
            // unique表示惟一性,targetClass表示的数据模型 这里就是说UserBackend模型对应的数据表字段username必须惟一
            ['username', 'unique', 'targetClass' => '\backend\models\UserBackend', 'message' => '用户名已存在.'],

            // string 字符串,这里咱们限定的意思就是username至少包含2个字符,最多255个字符
            ['username', 'string', 'min' => 2, 'max' => 255],

            // 下面的规则基本上都同上,不解释了

            ['email', 'filter', 'filter' => 'trim'],
            ['email', 'required', 'message' => '邮箱不能够惟恐'],
            ['email', 'email'],
            ['email', 'string', 'max' => 255],
            ['email', 'unique', 'targetClass' => '\backend\models\UserBackend', 'message' => 'email已经被设置了.'],
            ['password', 'required', 'message' => '密码不能够为空'],
            ['password', 'string', 'min' => 6, 'tooShort' => '密码至少填写6位'],   
            // default 默认在没有数据的时候才会进行赋值
            [['created_at', 'updated_at'], 'default', 'value' => date('Y-m-d H:i:s')],
        ];
    }
    /**
     * Signs user up.
     *
     * @return true|false 添加成功或者添加失败
     */
    public function signup()
    {
        // 调用validate方法对表单数据进行验证,验证规则参考上面的rules方法
        if (!$this->validate()) {
            return null;
        }

        // 实现数据入库操做
        $user = new UserBackend();
        $user->username = $this->username;
        $user->email = $this->email;

        // 设置密码,密码确定要加密,暂时咱们尚未实现,看下面咱们有实现的代码
        $user->setPassword($this->password);

        // 生成 "remember me" 认证key
        $user->generateAuthKey();

        // save(false)的意思是:不调用UserBackend的rules再作校验并实现数据入库操做
        // 这里这个false若是不加,save底层会调用UserBackend的rules方法再对数据进行一次校验,由于咱们上面已经调用Signup的rules校验过了,这里就不必在用UserBackend的rules校验了
        return $user->save(false);
    }
}

⑤、咱们在SignupForm的signup操做中看到,须要实现UserBackend的setPassword和generateAuthKey方法,咱们打开backend\models\UserBackend.php文件新增下面两个方法

/**
     * 为model的password_hash字段生成密码的hash值
     *
     * @param string $password
     */
    public function setPassword($password)
    {
        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }

    /**
     * 生成 "remember me" 认证key
     */
    public function generateAuthKey()
    {
        $this->auth_key = Yii::$app->security->generateRandomString();
    }

如今咱们添加新用户的界面是下面这样的(图见原文) 接着咱们测试下添加一个新用户test1,发现也是能够的。(图见原文) 暂停一下,说了那么多,咱们先回过头来缕缕实现的逻辑(分析图见原文)

登陆的实现

[考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原做者更但愿看客们查看原文,以防有任何问题不能更新全部文章,避免误导!]

查看原文

相关文章
相关标签/搜索