Laravel邮箱验证(重发方式)
Laravel E-mail verification (re-send method)
TLDR:我是 Laravel 的新手,但我正在尝试通过请求将验证电子邮件重新发送到电子邮件地址->输入('email').
案例:
[工作]
当用户注册时,我会通过 Laravel 的默认电子邮件验证脚手架向注册用户发送一封电子邮件。在用户可以使用该平台之前,需要对其进行验证。用户收到一封电子邮件,可以单击电子邮件中的按钮来验证其帐户。
[不工作]
但是,如果用户由于某种原因丢失了 his/her 验证电子邮件,我想通过 API 调用重新发送它,同时检查(但不公开)电子邮件是否可用。默认情况下,Laravels 电子邮件验证脚手架不支持此功能。
我做了什么:
在用户模型中添加:implements MustVerifyEmail
使用 use Illuminate\Contracts\Auth\MustVerifyEmail;
在默认的 VerificationController 中,我将:$this->middleware('auth')
更改为 $this->middleware('auth')->except(['resend']);
在 api.php 中添加了两条路由到自定义 VerifyEmailController class
Route::group(['middleware' => ['signed', 'throttle:6,1']], function () { Route::get('/email/verify/{id}/{hash}', [VerifyEmailController::class, '__invoke'])->name('verification.verify'); });
[这个有效]
Route::group(['middleware' => ['throttle:6,1']], function () { Route::post('/email/verify/resend', [VerifyEmailController::class, 'resend'])->name('verification.resend');});
[调用正常但重发方法逻辑错误]
这是我的 VerifyEmailController class 重发方法
当然不是这样做的,但由于我缺乏知识和经验,我想不出办法来完成这项工作。
现在我确实收到了 json 回复,它已经发送了电子邮件,但显然它还没有触发 Verify 事件来实际发送请求中的验证电子邮件。
如果您想要更多代码截图,请告诉我。
解决方案来自 :
在api.php中我声明了以下路线
Route::group(['middleware' => ['throttle:6,1']], function () {
Route::post('/email/verify/resend', [VerifyEmailController::class, 'resend'])->name('verification.resend');});
在 VerifyEmailController class 中,声明了以下方法
class VerifyEmailController extends Controller
{
public function resend(Request $request)
{
$this->validate($request, [
'email' => 'required|string|email|max:45',
]);
// These two lines below where the solution to my problem.
$user = User::where('email', $request->input('email'))->first();
$user->sendEmailVerificationNotification();
return Response::json(["status" => 'Verification e-mail send.', "email" => $request->input('email')], 201);
}
}
使用 sendEmailVerificationNotification() 方法重新发送验证邮件后,从您的数据库中获取用户
Route::post('resend/verification-email', function (\Illuminate\Http\Request $request) {
$user = User::where('email',$request->input('email'))->first();
$user->sendEmailVerificationNotification();
return 'your response';
})->middleware('throttle:6,1');
如果你需要帮助,你可以在你的控制器中做同样的事情给我添加评论
希望回答对您有所帮助
TLDR:我是 Laravel 的新手,但我正在尝试通过请求将验证电子邮件重新发送到电子邮件地址->输入('email').
案例:
[工作] 当用户注册时,我会通过 Laravel 的默认电子邮件验证脚手架向注册用户发送一封电子邮件。在用户可以使用该平台之前,需要对其进行验证。用户收到一封电子邮件,可以单击电子邮件中的按钮来验证其帐户。
[不工作] 但是,如果用户由于某种原因丢失了 his/her 验证电子邮件,我想通过 API 调用重新发送它,同时检查(但不公开)电子邮件是否可用。默认情况下,Laravels 电子邮件验证脚手架不支持此功能。
我做了什么:
在用户模型中添加:
implements MustVerifyEmail
使用use Illuminate\Contracts\Auth\MustVerifyEmail;
在默认的 VerificationController 中,我将:
$this->middleware('auth')
更改为$this->middleware('auth')->except(['resend']);
在 api.php 中添加了两条路由到自定义 VerifyEmailController class
Route::group(['middleware' => ['signed', 'throttle:6,1']], function () { Route::get('/email/verify/{id}/{hash}', [VerifyEmailController::class, '__invoke'])->name('verification.verify'); });
[这个有效]Route::group(['middleware' => ['throttle:6,1']], function () { Route::post('/email/verify/resend', [VerifyEmailController::class, 'resend'])->name('verification.resend');});
[调用正常但重发方法逻辑错误]
这是我的 VerifyEmailController class 重发方法
当然不是这样做的,但由于我缺乏知识和经验,我想不出办法来完成这项工作。
现在我确实收到了 json 回复,它已经发送了电子邮件,但显然它还没有触发 Verify 事件来实际发送请求中的验证电子邮件。
如果您想要更多代码截图,请告诉我。
解决方案来自
在api.php中我声明了以下路线
Route::group(['middleware' => ['throttle:6,1']], function () {
Route::post('/email/verify/resend', [VerifyEmailController::class, 'resend'])->name('verification.resend');});
在 VerifyEmailController class 中,声明了以下方法
class VerifyEmailController extends Controller
{
public function resend(Request $request)
{
$this->validate($request, [
'email' => 'required|string|email|max:45',
]);
// These two lines below where the solution to my problem.
$user = User::where('email', $request->input('email'))->first();
$user->sendEmailVerificationNotification();
return Response::json(["status" => 'Verification e-mail send.', "email" => $request->input('email')], 201);
}
}
使用 sendEmailVerificationNotification() 方法重新发送验证邮件后,从您的数据库中获取用户
Route::post('resend/verification-email', function (\Illuminate\Http\Request $request) {
$user = User::where('email',$request->input('email'))->first();
$user->sendEmailVerificationNotification();
return 'your response';
})->middleware('throttle:6,1');
如果你需要帮助,你可以在你的控制器中做同样的事情给我添加评论
希望回答对您有所帮助