注:此處所用的註冊等系列功能,均作用於laravel自帶的使用者認證機制
- composer安裝驗證碼
composer require "mews/captcha:~3.0"
2.執行以下命令生成配置檔案
config/captcha.php
php artisan vendor:publish --provider='Mews.aptcha.aptchaServiceProvider'
3.前端展示驗證碼
<img class="thumbnail captcha mt-3 mb-2" src="{{ captcha_src('flat') }}" onclick="this.src='/captcha/flat?'+Math.random()" title="點選圖片重新獲取驗證碼">
4.後端驗證(該擴充套件包是為Laravel定製的擴充套件包,完全相容laravel註冊功能,驗證非常方便)只需要在app/Http/Controllers/Auth/RegisterController.php中的驗證規則中加入如下程式碼:
'captcha' => ['required', 'captcha'],
- laravel自帶郵箱認證
laravel自帶的郵箱認證檔案位於 vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php ,因為此檔案採用trait宣告,因此我們快速的將內容通過use整合到使用者的模型中,並進行呼叫,如下:namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Auth\MustVerifyEmail as MustVerifyEmailTrait; class User extends Authenticatable { use Notifiable, MustVerifyEmailTrait;
為了程式碼的規範,我們可以接入larave自帶的郵箱驗證介面
Illuminate\Contracts\Auth\MustVerifyEmail
,規定模型必須擁有相關的方法,具體方法如下(方法在MustVerifyEmailTrait
中已經定義好,直接呼叫既可):hasVerifiedEmail()
檢測使用者 Email 是否已認證;markEmailAsVerified()
將使用者標示為已認證;sendEmailVerificationNotification()
傳送 Email 認證的訊息通知,觸發郵件的傳送;getEmailForVerification()
獲取傳送郵件地址,提供這個介面允許你自定義郵箱欄位。
-
傳送郵件
我們使用了 Laravel 自帶的RegisterController
,控制器通過載入Illuminate.oundation.uth.egistersUsers
trait 來引入框架的註冊功能,此時我們開啟此 trait 來翻閱原始碼並定位到register(Request $request)
方法:public function register(Request $request) { // 檢驗使用者提交的資料是否有誤 $this->validator($request->all())->validate(); // 建立使用者同時觸發使用者註冊成功的事件,並將使用者傳參 event(new Registered($user = $this->create($request->all()))); // 登入使用者 $this->guard()->login($user); // 呼叫鉤子方法`registered()` return $this->registered($request, $user) ?: redirect($this->redirectPath()); }
此方法處理了使用者提交表單後的邏輯,我們把重點放在
event(new Registered($user = $this->create($request->all())));
,這裡使用了 Laravel 的事件系統,觸發了Registered
事件。開啟
app/Providers/EventServiceProvider.php
檔案,此檔案的$listen
屬性裡我們可以看到註冊了Registered
事件的監聽器:protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], ];
開啟
SendEmailVerificationNotification
類,閱讀其原始碼:vendor/laravel/framework/src/Illuminate/Auth/Listeners/SendEmailVerificationNotification.php
<?php
namespace Illuminate\Auth\Listeners;
use Illuminate\Auth\Events\Registered;
use Illuminate\Contracts\Auth\MustVerifyEmail;
class SendEmailVerificationNotification
{
/**
* 處理事件
*
* @param \Illuminate\Auth\Events\Registered $event
* @return void
*/
public function handle(Registered $event)
{
// 如果 user 是繼承於 MustVerifyEmail 並且還未啟用的話
if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) {
// 傳送郵件認證訊息通知(認證郵件)
$event->user->sendEmailVerificationNotification();
}
}
}
可以看出 Laravel 預設已經為我們設定了郵件傳送的邏輯,接下來我們來測試一下。
3.測試郵件
測試之前,我們先設定下郵件傳送到 log 中,以便後面的測試:
修改環境設定檔案.env
MAIL_DRIVER=log
郵件一般發在storage/logs目錄下的日誌檔案中