学习笔记,持续更新
总结
- 数据表中需要两个字段,一个
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);
});
}