使用像 Laravel 這樣的架構的最大好處之一是許多常見的用例或問題已經得到解決;郵箱驗證也不例外。
從 Laravel 5.7 開始,可以使用 Laravel 開箱即用地實作電子郵件驗證 外貿建站,外貿獨立站,外貿推廣,谷歌推廣,谷歌SEO,谷歌優化。
我假設您已經擁有此設定并在您自己的環境中工作。
預設情況下,Laravel 發出的驗證郵件将在60 分鐘後過期。在某些情況下這可能沒問題,但在我的情況下這沒有任何實際用途。使用者抱怨他們點選了連結,隻是因為它不起作用,而且由于舊連結過期,他們不得不請求新的驗證電子郵件。
要解決這個問題,有兩種解決方案,更新配置的過期時間,或者重寫生成驗證 URL 的方法。
更新配置的過期時間
這是 Laravel 5.8 中引入的功能,是以如果你還在使用 Laravel 5.7,請跳到下一節。
如果我們檢查,Illuminate\Auth\Notifications\VerifyEmail我們可以看到該verificationUrl方法如下所示:
protected function verificationUrl($notifiable)
{
return URL::temporarySignedRoute(
'verification.verify',
Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
[
'id' => $notifiable->getKey(),
'hash' => sha1($notifiable->getEmailForVerification()),
]
);
}
正如您在上面看到的,在生成臨時簽名路由時,架構會嘗試在 處擷取一個配置變量,auth.verification.expire如果找不到,則會回退到 60 分鐘。
如果您仍想在驗證 URL 中包含過期時間,則隻需将過期時間的配置設定添加到您的config/auth.php檔案中,如下所示:
'verification' => [
'expire' => 525600, // One year in minutes - enter as many minutes as you would like here
],
覆寫驗證 URL 的生成
就我而言,我不想隻更新過期時間,我想完全删除它;贊成簡單的簽名路線。
為此,我們隻需要擴充VerifyEmail類并覆寫verificationUrl方法。
我在我的項目中有一個名為的目錄,Core我将所有助手、自定義類和一般應用程式邏輯放在其中,這些邏輯在邏輯上不适合其他任何地方。您可能有一個類似的目錄或不同的地方,您希望放置此代碼;是以,請酌情替換。
添加新檔案App/Core/Auth/VerifyEmail.php
用以下内容填充此檔案:
<?php
namespace App\Core\Auth;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\URL;
class VerifyEmail extends \Illuminate\Auth\Notifications\VerifyEmail
{
protected function verificationUrl($notifiable)
{
return URL::signedRoute(
'verification.verify',
[
'id' => $notifiable->getKey(),
'hash' => sha1($notifiable->getEmailForVerification()),
]
);
}
}
更新您的User模型以覆寫sendEmailVerificationNotification使用上面新建立的類的方法:
/**
* Send the email verification notification.
*
* @return void
*/
public function sendEmailVerificationNotification()
{
$this->notify(new \App\Core\Auth\VerifyEmail);
}
瞧!現在将使用您自定義的驗證 URL 生成您的電子郵件驗證電子郵件
在我上面的例子中,我仍然想要一個簽名的路由,以便我可以驗證驗證 URL 沒有被篡改,但是你可以用你想要的任何方式替換它來生成 URL。例如,讓我們從我的第一種方法中實作一年逾時;隻需更新verificationUrl為:
protected function verificationUrl($notifiable)
{
return URL::temporarySignedRoute(
'verification.verify',
Carbon::now()->addMinute(525600),
[
'id' => $notifiable->getKey(),
'hash' => sha1($notifiable->getEmailForVerification()),
]
);
}