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,發現也是能夠的。(圖見原文) 暫停一下,說了那麼多,咱們先回過頭來縷縷實現的邏輯(分析圖見原文)

登陸的實現

[考慮目前國內網站大部分採集文章十分頻繁,更有甚者不註明原文出處,原做者更但願看客們查看原文,以防有任何問題不能更新全部文章,避免誤導!]

查看原文

相關文章
相關標籤/搜索