针对本章的一些小问题提出建议
仔细思考逻辑,会发现,自动生成的字段
activation_token
是有可能重复的(虽然概率几乎等于中500万),但是处于严谨方面的考虑,我对代码作了以下修改
- 路由配置部分 routes/web.php
... // 账户激活路由:不再是传1个参数,而是传2个参数(新注册用户的主键id 和 邮箱激活码) Route::get('/signup/user/{id}/confirm/{token}', 'UsersController@confirmEmail')->name('confirm_email'); ...
- 邮件模板部分 resources/views/emails/confirm.blade.php
... 请点击下面的链接完成注册: <!-- 对应路由格式,这里注意2个参数使用数组 [] 的形式传过去的 --> <a href="{{ route('confirm_email', [$user->id, $user->activation_token]) }}"> {{ route('confirm_email', [$user->id, $user->activation_token]) }} </a> ...
-
激活逻辑部分
public function confirmEmail($id, $token) { $user = User::find($id); //根据id找到用户 // 匹配 token ,确认激活,更新数据 if($user->activation_token == $token) { $user->activated = true; $user->activation_token = null; $user->save(); // 自动登陆,发送提示,重定向 Auth::login($user); session()->flash('success', '恭喜你,激活成功!'); return redirect()->route('users.show', [$user]); } else { session()->flash('danger', '激活失败。请再次点击邮件中的链接重试'); return redirect('/'); } }
- 在激活逻辑中,我们先通过传过来的 id 去找对应的那条数据,然后比对找到的这条数据中的 activation_token 字段是不是等于传递过来的参数 $token,如果相等则激活。
还有我莫名其妙踩了个坑,就是迁移文件生成的 activated 字段用
...->default(false)
设置了默认值,结果不管用,这个错误发生的原因现在还没找到,我是用数据库管理工具强行设置该字段拥有默认值 0 最终解决的。
推荐文章: