忘記密碼是應用中常見的場景之一,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
:
<form method="POST" action="/password/email">
{!! csrf_field() !!}
<div>
Email
<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
<button type="submit">
傳送密碼重置連結
</button>
</div>
</form>
複製程式碼
然後建立重置密碼路由對應檢視resources/views/auth/reset.blade.php
:
<form method="POST" action="/password/reset">
{!! csrf_field() !!}
<input type="hidden" name="token" value="{{ $token }}">
<div>
Email:<input type="email" name="email" value="{{ old('email') }}">
</div>
<div>
新密碼:<input type="password" name="password">
</div>
<div>
確認密碼:<input type="password" name="password_confirmation">
</div>
<div>
<button type="submit">
重置密碼
</button>
</div>
</form>
複製程式碼
此外我們還要建立一個額外檢視——傳送密碼重置連結的郵件模板檢視resources/views/emails/password.blade.php
,用於為該郵件提供檢視模板:
點選這裡重置密碼: {{ url('password/reset/'.$token) }}
複製程式碼
如果該郵件模板檢視檔案路徑位於其他地方,不要忘了配置config/auth.php
中的password.email
值與新路徑對應。
5、傳送郵件配置
接下來我們要做的是配置相關檔案實現郵件傳送功能為下一步測試做準備。
Laravel使用SwiftMailer庫提供的郵件API實現郵件操作,詳情可檢視郵件文件,這裡我們僅作簡單配置實現郵件傳送,郵件配置檔案是config/mail.php
:
<?php
return [
'driver' => 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=smtp
MAIL_HOST=smtp.163.com
MAIL_PORT=25
MAIL_USERNAME=yaojinbu@163.com
MAIL_PASSWORD=mypassword
MAIL_ENCRYPTION=null
複製程式碼
我使用的是163郵箱,其它郵箱參考對應郵箱相關設定項,並將自己的賬戶資訊填寫到MAIL_USERNAME
和MAIL_PASSWORD
。
此外我們還要配置mail.php
中的from
配置如下:
'from' => ['address' => 'yaojinbu@163.com ', 'name' => 'Laravel學院'],
複製程式碼
這裡只需要將address
和.env
檔案中的MAIL_USERNAME
值相匹配即可。至於name
值就是郵箱中發件人名稱,可自定義。
做好這一步配置後,接下來即可測試密碼重置了。