📅  最后修改于: 2023-12-03 15:27:14.879000             🧑  作者: Mango
在web应用程序中,电子邮件验证是一个很常见的功能,它可以保证用户输入的电子邮件地址是正确且可用的。Laravel框架提供了很方便的功能来实现电子邮件验证。本文将介绍如何在Laravel中实现电子邮件验证。
首先,在composer.json
文件的require
部分中添加以下依赖包:
"require": {
"laravel/framework": "5.8.*",
"illuminate/mail": "5.8.*"
}
然后,在命令行中执行以下命令来安装依赖:
composer install
在.env
文件中,填写相关的mail配置信息,例如:
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=null
这里我们使用Mailtrap作为邮件服务,并填写相应的用户名和密码。如果你使用的是其他邮件服务,需要根据实际情况填写。
接下来,在命令行中执行以下命令,生成一个验证器:
php artisan make:request VerifyEmailRequest
这里我们将验证器命名为VerifyEmailRequest
,你可以使用任意的名称。然后打开生成的VerifyEmailRequest.php
文件,在rules()
方法中添加以下规则:
public function rules()
{
return [
'email' => 'required|email|unique:users'
];
}
其中,email
是验证的字段名。 required
表示该字段不可为空,email
表示该字段需要为正确的email格式, unique:users
则表示该字段的值在users
表中需要是唯一的。
打开app/Http/Controllers/Auth/RegisterController.php
文件,在create()
方法中,将$user
对象的相应字段赋值后,调用其sendEmailVerificationNotification()
方法后保存用户:
protected function create(array $data)
{
$user = new User;
$user->name = $data['name'];
$user->email = $data['email'];
$user->password = Hash::make($data['password']);
$user->sendEmailVerificationNotification();
$user->save();
return $user;
}
这里我们在create()
方法中调用sendEmailVerificationNotification()
方法,该方法会在用户保存到数据库后发送验证邮件至用户提供的 email 地址。
当用户点击验证邮件中的链接后,将跳转到在 .env
文件中设置的 APP_URL
常量连接,该 URL 由 Illuminate/Routing/UrlGenerator
类生成。 跳转后将请求进入verify
路由。打开routes/web.php
文件,添加以下代码:
Route::get('email/verify/{token}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
其中,第一行代码表示当用户点击验证邮件中的链接时,将调用Auth\VerificationController
的verify()
方法。第二行代码表示当用户请求重新发送验证邮件时,调用Auth\VerificationController
的resend()
方法。
接下来,在命令行中执行以下命令,生成控制器:
php artisan make:controller Auth/VerificationController
打开app/Http/Controllers/Auth/VerificationController.php
文件,在__construct()
方法中添加相应的 middleware:
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
该middleware可以确保只有经过身份验证的用户才能访问verify()
方法,同时限制每分钟的访问次数。然后在 verify()
方法中执行以下代码:
public function verify(Request $request)
{
$user = User::find($request->route('id'));
if ($user->hasVerifiedEmail()) {
return redirect($this->redirectPath());
}
if ($user->markEmailAsVerified()) {
event(new Verified($user));
}
return redirect($this->redirectPath())->with('verified', true);
}
其中,$user->markEmailAsVerified()
方法将把该用户email验证标记为 true。event(new Verified($user))
表示触发Verified
事件,以便自定义进一步的操作。最后将重定向到$this->redirectPath()
上,并把 verified 标记设置为 true。
最后,在注册登录逻辑的相应控制器(如 app/Http/Controllers/Auth/LoginController.php
)中加入以下代码:
use Illuminate\Foundation\Auth\VerifiesEmails;
class LoginController extends Controller
{
use VerifiesEmails;
……
}
这里我们使用了VerifiesEmails
trait,该trait内部带有许多默认的方法实现了所有电子邮件验证所需的路由和方法。
至此,Laravel电子邮件验证功能已经完成。 当用户在注册后验证他们的电子邮件地址时,不仅可以增加网站的安全性,还可以确保用户提供的电子邮件地址是正确的且可用的。