忘记密码是应用中常见的场景之一,Laravel 5.1也提供了对密码重置的支持,我们只需稍微做一下配置即可轻松实现重置密码。
1、实现思路
通过给用户注册邮箱发送包含特定令牌的重置密码链接,然后用户登录邮箱通过访问该重置密码链接实现密码的重置。
2、数据表&模型
- 实现
CanResetPasswordContract
契约并使用CanResetPassword
trait的User
模型(Laravel自带) - 用于存放重置密码令牌的表
password_resets
(Laravel自带该表对应迁移文件,中已一并创建)
3、创建路由
Laravel自带了用于密码重置的控制器Auth\PasswordController
,和上一节提到的AuthController
位于统一目录下。重置密码相关的业务逻辑都是通过该控制器中使用的ResetsPasswords
trait来实现的。下面我们在routes.php
中为重置密码定义相关路由规则:
// 发送密码重置链接路由Route::get('password/email', 'Auth\PasswordController@getEmail');Route::post('password/email', 'Auth\PasswordController@postEmail');// 密码重置路由Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');Route::post('password/reset', 'Auth\PasswordController@postReset');复制代码
4、创建视图
定义好路由之后我们为get请求定义对应视图文件,首先创建发送密码重置链接路由对应视图resources/views/auth/password.blade.php
:
复制代码
然后创建重置密码路由对应视图resources/views/auth/reset.blade.php
:
复制代码
此外我们还要创建一个额外视图——发送密码重置链接的邮件模板视图resources/views/emails/password.blade.php
,用于为该邮件提供视图模板:
点击这里重置密码: { { url('password/reset/'.$token) }}复制代码
如果该邮件模板视图文件路径位于其他地方,不要忘了配置config/auth.php
中的password.email
值与新路径对应。
5、发送邮件配置
接下来我们要做的是配置相关文件实现邮件发送功能为下一步测试做准备。
Laravel使用库提供的邮件API实现邮件操作,详情可查看,这里我们仅作简单配置实现邮件发送,邮件配置文件是config/mail.php
:
env('MAIL_DRIVER', 'smtp'), 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'from' => ['address' => null, 'name' => null], 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'sendmail' => '/usr/sbin/sendmail -bs', 'pretend' => false,];复制代码
可见大部分配置在.env
文件中设置,这里我的.env
文件配置如下:
MAIL_DRIVER=smtpMAIL_HOST=smtp.163.comMAIL_PORT=25MAIL_USERNAME=yaojinbu@163.comMAIL_PASSWORD=mypasswordMAIL_ENCRYPTION=null复制代码
我使用的是163邮箱,其它邮箱参考对应邮箱相关设置项,并将自己的账户信息填写到MAIL_USERNAME
和MAIL_PASSWORD
。
此外我们还要配置mail.php
中的from
配置如下:
'from' => ['address' => 'yaojinbu@163.com ', 'name' => 'Laravel学院'],复制代码
这里只需要将address
和.env
文件中的MAIL_USERNAME
值相匹配即可。至于name
值就是邮箱中发件人名称,可自定义。
做好这一步配置后,接下来即可测试密码重置了。