- 给数据库User表添加邮箱令牌以及是否活跃字段
方法一: 普通方法
database/migrations/2014_10_12_000000_create_users_table.php 追加字段
$table->string('email_token')->unique();
$table->tinyInteger('email_alive')->default(0);
database/factories/UserFactory.php 追加数据
'email_token' => Str::random(10),
'email_alive' => false,
重新生成数据表
artisan migrate:fresh --seed
方法二: 模型事件
Laravel 的 Events(事件) 及 Observers(观察者)
Laravel 模型事件执行顺序
database/migrations/2014_10_12_000000_create_users_table.php 追加字段
$table->string('email_token')->unique();
$table->tinyInteger('email_alive')->default(0);
生成observer文件
artisan make:observer UserObserver
在文件中写入模型事件
class UserObserver
{
public function creating(User $user) {
$user->email_token = Str::random(10); // 生成十位验证码
$user->email_alive = false;
}
}
app/Providers/AppServiceProvider.php中进行注册
public function boot()
{
User::observe(UserObserver::class);
}
重新生成数据表
artisan migrate:fresh --seed
- 在控制中添加验证方法,并添加路由
public function confirmEmailToken($token) {
...
}
Route::get('confirmEmailToken/{token}', 'UserController@confirmEmailToken')->name('confirmEmailToken');
- 控制器store方法中添加邮箱发送验证码功能
// 创建注册数据
$user = User::create($data);
// 发送验证邮件
\Mail::to($user)->send(new RegMail($user));
session()->flash('success', '注册成功请完成验证');
- 修改RegMail方法
class RegMail extends Mailable
{
use Queueable, SerializesModels;
// 设置一个公共变量
public $user;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($user)
{
$this->user = $user;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
// 不需要传值,会自动向view返回公共变量
return $this->view('mail.reg');
}
}
- 编辑邮件内容
resources/views/mail/reg.blade.php
<a href="{{route('confirmEmailToken', $user->email_token)}}">点击完成注册</a>
{{$user->email_token}}
- 编辑验证方法
public function confirmEmailToken($token) {
$user = User::where('email_token', $token)->first();
if ($user) {
$user->email_active = true;
$user->save();
session()->flash('success', '注册成功');
return redirect('/');
}
}