學習筆記,質量不高,純屬加深個人理解,請勿浪費時間閱讀。
總結
- 數據表中可使用兩個字段,一個
actiavtion_token
記錄用戶註冊時生成的令牌。另一個是activated
,布爾值,記錄用戶是否已經激活成功 - 模型中使用
creating
方法,該方法設定監聽模型創建之前的事件。(用戶在註冊時生成$user->activation_token)
- 設定static boot()方法,
- 重寫 parent::boot()
- static::creating(function($user)){ 生成隨機30個字符串}
- 在
env
中設置MAIL_DIRVER
爲log
(本地測試) - 路由:路由中設定方法,註冊時生成{token}
- 視圖:生成激活連接
- 登錄控制器:
Auth::user->activated()
判斷該用戶實例的avtivated
字段是否爲true
- 成功:渲染連接跳轉到主頁,並綁定
Auth::user()
權限 - 失敗:自定義,例如設置用戶未激活時不能發帖(看項目需求)
- 成功:渲染連接跳轉到主頁,並綁定
- 發送郵件
- view 發送郵件視圖
- data 綁定數據
- from 發件人
- name 發件人名稱
- to 收件人
- subject 主題
- 調用Mail::send()
- 用戶控制器:用戶點擊註冊連接後,查找用戶的
activation_token
字段判斷兩者的token
是否相同
- 模型::where(‘activation_token’,$token)->firstOrFail() 若匹配成功則進行以下修改
- 模型實例->activated=true 將激活狀態從false變更爲true
- 模型實例->activation_tokne=null 將用戶token設置爲null
- 入庫save()
- 相關渲染跳轉
- 在log中調試
賬戶激活
常見的門戶網站,用戶一旦註冊成功即可登錄。只有當用戶成功激活自己的帳號時才能進行更多操作。
需要給用戶設定兩個字段,用於保存用戶的激活令牌和激活狀態。
- 激活令牌驗證用戶身份是否唯一
- 激活狀態則判斷用戶是否已激活
一般流程如下
- 用戶註冊成功後,自動生成激活令牌
- 將激活的令牌以連接的形式附帶在註冊郵件中,併發送到用戶註冊的郵箱上
- 用戶點擊註冊鏈接跳轉到指定路由,路由收到激活令牌參數映射給相關控制器處理
- 控制器拿到激活的令牌並進行驗證,驗證通過後對該用戶進行激活,並將其激活狀態設爲已激活
- 用戶激活成功,自動登錄
表設計
除了常規字段,還需添加2個字段,一個是activation_token
默認爲可選(非激活狀態下),另一個爲activated
默認爲false判斷 用戶是否已激活
生成令牌
Eloquent模型默認提供多個事件。例如creating
方法可以監聽模型被創建之前進行一些設置。對事件進行監聽和訂閱,從而在事件被觸發時接收到相應並執行一些指定操作
creating
用於監聽模型被創建之前的事件created
用於監聽模型創建之後的事情
在模型中添加
public static function boot()
{
//重寫父類構造方法
parent::boot()
//模型實例在創建前,該模型實例生成一個隨機30位字符的字符串
static::creating(function($user){
$user->activation_token=str_random(30)
}
}
郵件程序
lara可使用Log郵件驅動的方式來調試郵件發送功能(本地測試)storage/logs/laravel.log
激活賬號
激活路由
當用戶註冊時,將附帶用戶生成的激活令牌,在用戶是點擊激活之後,將令牌通過路由參數傳遞到控制器指定動作,最終生成如下
http://自定義域名/xxxxxx/xxxxx/O1TTEr3faVq4fpzFXaOVQD4EAO9mQL
登錄時檢查是否已激活
在相關控制器中,通過判斷Auth::user()->activated
是否爲true
再執行相關指令。可設定未激活時無法進行某些操作.
發送郵件
use Mail //引入Mail類
protected function sendEmailConfirmationTo($user)
{
$view = //視圖
$data = //視圖綁定數據
$from = //發件人郵箱
$name = //發件人名稱
$to = //收件人
$subject = //郵件主體
Mail::send($視圖, $綁定數據, function ($message) use ($發件人郵箱, $發件人名稱, $收件人, $主題) {
$message->from($from, $name)->to($to)->subject($subject);
});
}