使用一个事件的处理分为以下几点
(1)注册事件和事件监听器
(2)编写事件监听器内的触发操作
具体可以查看:Laravel事件以及模型事件小结
PS:Observer观察者也是对模型事件进行处理,不过两者略有区别,可以参考Laravel 中的模型事件与 Observer
所以对于‘利用事件进行邮箱验证功能’有以下几点操作:
前期准备:
$table->string('mail_token')->default('');
$table->tinyInteger('mail_status')->default('0');
- 使用中间件判断是否已经登陆,登陆的账户是否验证过邮箱
Route::middleware('Mail.check')->get('/', function (\Modules\Admin\Entities\Module $module) {
return app()->build('\Modules\\'.$module->getDefault().'\Http\Controllers\HomeController')->index();
});
public function handle($request, Closure $next)
{
$user = auth('web')->user();
if (auth('web')->check() && $user->mail_status == 0) {
return redirect()->route('check_mail_show');
}
return $next($request);
}
注册中间件
// app/Http/Kernel.php
'Mail.check' => \App\Http\Middleware\MailCheckMiddleware::class,
中间件验证
public function handle($request, Closure $next)
{
$user = auth('web')->user();
if (auth('web')->check() && $user->mail_status == 0) {
return redirect()->route('check_mail_show');
}
return $next($request);
}
- 在事件的服务提供者中注册邮箱注册事件app/Providers/EventServiceProvider.php(用于发送验证邮箱)
事件对监听器 ,是一对多的关系。想做出多种监听,可以放在一起。
atisan make:listener SendRegisterMailListener
protected $listen = [
// Registered::class就是一个默认的注册事件
// Registered因为是ed所以是在注册完成之后执行
Registered::class => [
// SendRegisterMailListener::class事件监听器,负责具体的事件操作
// 绑了两个监听器,符合一对多的关系
SendRegisterMailListener::class,
SendEmailVerificationNotification::class,
],
];
- 编辑SendRegisterMailListener事件监听器
public function handle(Registered $event)
{
$user = $event->user;
$email_token = \Str::random(5);
$user->mail_token = $email_token;
$user->save();
// 发送验证邮件
$user->notify(new EmailNotify($user));
}
PS:2,3两步其实可以换成Observer,即将发送验证邮件方法放到Observer去执行
- 生成Notify模板
atisan make:notification EmailNotify
public function __construct($user)
{
$this->user = $user;
}
public function toMail($notifiable)
{
return (new MailMessage)
->subject('请验证邮箱')
->line('请验证邮箱')
->action('请验证邮箱', url('/check_mail_token/'.$this->user->mail_token))
->line('Thank you for using our application!');
}
- 因为已经注册并登陆了,但是mail_token为false,所以验证失败根据中间件跳到
route('check_mail_show')
- 可以使用Laravel自带的MailHog来验证邮箱,配置如下
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=test@qq.com
MAIL_FROM_NAME="${APP_NAME}"
// 邮件查看:
http://www.mushishi.com:8025 (其中,www.mushishi.com为当前域名)
7. 点击验证邮箱进行验证
// 邮箱验证相关
Route::view('/check_mail_show', 'auth.check_mail_show')->name('check_mail_show');
Route::get('/send_mail_token', 'MailController@send_mail_token')->name('send_mail_token');
Route::get('/check_mail_token/{token}', 'MailController@check_mail_token')->name('check_mail_token');
public function send_mail_token() {
$user = auth('web')->user();
$user->notify(new EmailNotify($user));
return back();
}
public function check_mail_token($token) {
$user = User::where('mail_token', $token)->first();
if ($user) {
$user->mail_status = true;
$user->update();
session()->flash('success', '邮箱验证成功');
return redirect('/');
};
session()->flash('success', '邮箱验证失败');
return redirect('/');
}