最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Yii2框架實現(xiàn)注冊和登錄教程

 更新時間:2016年09月30日 09:41:48   作者:wallen  
這篇文章主要介紹了Yii2框架實現(xiàn)注冊和登錄教程的相關資料,需要的朋友可以參考下

注冊

在advanced模板中,進入frontend/index.php?r=site%2Fsignup頁面,可以看到框架的注冊頁面

填寫完Username、Email和Password后點擊Signup后,如果格式不對,frontend/models/SignuForm中的rules()函數(shù)會進行初步驗證,所有格式正確后,數(shù)據(jù)傳輸?shù)?frontend/controllers /SiteController中的 actionSignup()函數(shù)中,函數(shù)加載用戶輸入的注冊信息,在frontend/models/SignupForm中的signup()函數(shù),

以下引用的文字為解釋函數(shù)中的具體細節(jié),不閱讀不影響整體,因為沒有折疊文字功能,故采用引用的方法,下同

if (!$this->validate()) {
  return null;
}

signup() 函數(shù)首先調(diào)用 yii2/base/Model中的validate() 函數(shù)進行驗證
第一步,清除使用frontend/models/SignuForm中的rules()函數(shù)在用戶輸入時的錯誤信息

if ($clearErrors) {
  $this->clearErrors();
}

第二步,beforeValidate()函數(shù)觸發(fā)beforeValidate事件并返回true
第三步,設置scenario,默認是default
第四步,因為這里的$attributeNames為null,

$attributeNames = $this->activeAttributes();


執(zhí)行后返回

array(3) { [0]=> string(8) "username" [1]=> string(5) "email" [2]=> string(8) >"password" }

第五步,$this->getActiveValidators()會得到frontend/models/SignuForm中的rules()中11條驗證規(guī)則給validateAttributes()進行驗證

第六步,執(zhí)行afterValidate()函數(shù)觸發(fā)afterValidate事件

最后 如果所有驗證都通過,$this->hasErrors()為false,所以函數(shù)最后返回true

我們看一下數(shù)據(jù)表user的字段

用戶輸入了username、password和email,Yii2框架是如何生成其他的字段的呢,先看password_hash,在SignupFrom中的signup函數(shù)中的密碼生成是setPassword函數(shù),該函數(shù)在common/models/User中,setPassword函數(shù)調(diào)用了yii2/base/Security中的每一條規(guī)則generatePasswordHash函數(shù)。

if (function_exists('password_hash')) {
  /** @noinspection PhpUndefinedConstantInspection */
  return password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);
}

如果有,就使用password_hash函數(shù)進行加密,如果PHP沒有password_hash函數(shù),就使用crypt函數(shù)加密,初步判斷應該是為了兼容PHP低于5.5的版本,畢竟大于5.5的版本才開始有password_hash函數(shù)

common/models/User的signup()函數(shù)在對password加密后,就會繼續(xù)生成一個auth key,auth key是當用戶在登錄的時候點擊 remember me的時候的驗證信息,

auth key生成的方法也是在yii2/base/Security中的generateRandomString,generateRandomString調(diào)用generateRandomKey函數(shù),如果你的PHP版本為是5.2~5.6或者是7,那就是用random_bytes生成一個32個字節(jié)的字符串,如果不是,當你用的系統(tǒng)時windows并且安裝了OpenSSL,就會調(diào)用openssl_random_pseudo_bytes函數(shù)生成,如果你未安裝OpenSSL,就會使用mcrypt_create_iv生成。

如果你使用的系統(tǒng)不是windows,就需要調(diào)用/dev/urandom,FreeBSD系統(tǒng)特殊,會調(diào)用/dev/random,然后調(diào)用stream_set_read_buffer方法生成8字節(jié)的字符文件,生成后,通過fread函數(shù)讀取該文件中的32個字節(jié),然后返回該數(shù)據(jù)。
password_reset_token在用戶注冊的時候是為空的,當用戶忘記密碼在登錄頁面點擊reset it 后生成的,用來給用法發(fā)送郵件后重置密碼時進行驗證。

status 在common/models/User中定義的

const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;

用戶注冊時rules中的status默認為為10,
created_time和updated_time也是在common/models/User中的behaviors()函數(shù)中生成

用戶的數(shù)據(jù)驗證合格,加上框架生成的數(shù)據(jù),然后存儲進數(shù)據(jù)的user表里。

登錄

關于frontend/controllers/SiteController中的actionSignup()中的

if (Yii::$app->getUser()->login($user)) {
  return $this->goHome();
}

就是用戶注冊后,這時該用戶的數(shù)據(jù)已經(jīng)寫入數(shù)據(jù)庫了,開始登錄的過程了

登錄的過程在yii2/web/User里的login()函數(shù)中

第一步,執(zhí)行beforeLogin()函數(shù)觸發(fā)beforeLogin事件
第二步,switchIdentity()函數(shù)把個人信息換成當前用戶的信息,把所有的cookie都銷毀,然后把當前用戶的信息都存入到session和cookie中
第三步,獲取當前用戶的id和用戶登錄的ip,并寫入到log中
第四步,執(zhí)行afterLogin()函數(shù)觸發(fā)afterLogin事件

最后 返回true

判斷登錄成功后,return $this->goHome();跳轉(zhuǎn)到主頁。

相關文章

  • PHP基于面向?qū)ο蠓庋b的分頁類示例

    PHP基于面向?qū)ο蠓庋b的分頁類示例

    這篇文章主要介紹了PHP基于面向?qū)ο蠓庋b的分頁類,結合實例形式分析了php分頁類針對頁碼判斷、顯示等操作的封裝及分頁類使用相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • PHP設計模式之裝飾器模式定義與用法簡單示例

    PHP設計模式之裝飾器模式定義與用法簡單示例

    這篇文章主要介紹了PHP設計模式之裝飾器模式定義與用法,結合簡單實例形式分析了php裝飾器模式的概念、原理、定義與簡單使用方法,需要的朋友可以參考下
    2018-08-08
  • 基于PHP的微信公眾號的開發(fā)流程詳解

    基于PHP的微信公眾號的開發(fā)流程詳解

    這篇文章主要介紹了基于PHP的微信公眾號的開發(fā)流程詳解,文章通過示例代碼和服務器及菜單配置的圖文講解介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • PHP array_push 數(shù)組函數(shù)

    PHP array_push 數(shù)組函數(shù)

    想到PHP操作數(shù)組時候,給一個數(shù)組添加一個數(shù)組單元時候可以有兩種方式
    2009-12-12
  • PHP簡單實現(xiàn)文本計數(shù)器的方法

    PHP簡單實現(xiàn)文本計數(shù)器的方法

    這篇文章主要介紹了PHP簡單實現(xiàn)文本計數(shù)器的方法,涉及PHP針對文本文件的簡單判斷,讀取及寫入等操作技巧,需要的朋友可以參考下
    2016-04-04
  • php下保存遠程圖片到本地的辦法

    php下保存遠程圖片到本地的辦法

    有些時候我們看到網(wǎng)絡上有一些漂亮的圖片,而又不想手動去保存下來,尤其是大量的這樣的圖片,那這個時候我們需要寫一段程序來幫助我們完成這個工作。
    2010-08-08
  • 攻克CakePHP系列三 表單數(shù)據(jù)增刪改

    攻克CakePHP系列三 表單數(shù)據(jù)增刪改

    下面的代碼是CakePHP下對表單數(shù)據(jù)的增加,刪除,修改實現(xiàn)代碼
    2008-10-10
  • PHP實現(xiàn)將顏色hex值轉(zhuǎn)換成rgb的方法

    PHP實現(xiàn)將顏色hex值轉(zhuǎn)換成rgb的方法

    這篇文章主要介紹了PHP實現(xiàn)將顏色hex值轉(zhuǎn)換成rgb的方法,涉及PHP針對字符串與數(shù)組的數(shù)學運算相關操作技巧,需要的朋友可以參考下
    2016-05-05
  • 關于js與php互相傳值的介紹

    關于js與php互相傳值的介紹

    本篇文章是對js與php互相傳值的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP利用ThinkPHP6完整實現(xiàn)用戶分頁功能

    PHP利用ThinkPHP6完整實現(xiàn)用戶分頁功能

    分頁功能在Web開發(fā)中是一個非常常見的需求,特別是在處理大量數(shù)據(jù)時,為了提高用戶體驗和性能,將數(shù)據(jù)分頁展示是必不可少的,ThinkPHP6作為一款流行的PHP框架,自帶了強大的分頁功能,本文將詳細介紹如何使用ThinkPHP6實現(xiàn)分頁功能,需要的朋友可以參考下
    2023-12-12

最新評論

阳城县| 饶河县| 宝丰县| 黄冈市| 独山县| 禄劝| 亳州市| 华容县| 台南县| 文山县| 沁水县| 家居| 台南县| 德兴市| 方正县| 阿瓦提县| 方正县| 台江县| 芜湖市| 卢氏县| 全椒县| 商水县| 游戏| 蕲春县| 江津市| 城步| 绩溪县| 周宁县| 汝阳县| 潞西市| 阿勒泰市| 叶城县| 饶阳县| 兰州市| 佛坪县| 石林| 临城县| 平陆县| 和平县| 汨罗市| 和硕县|