Laravel 5.7自定义重发邮件方法

时间:2019-03-10 02:18:52

标签: laravel

我自定义了我的LoginController,以防止用户在未验证帐户的情况下登录,因为这不是Laravel的默认行为。

现在,用户正在登录并且帐户未通过验证,我问他是否想要一个新的邮件通知来验证他的帐户。由于我没有$request->user(),因此我不知道如何覆盖此方法:

VerificationController.php

public function resend(Request $request)
{
    if ($request->user()->hasVerifiedEmail()) {
        return redirect($this->redirectPath());
    }

    $request->user()->sendEmailVerificationNotification();

    return back()->with('resent', true);
}

我曾考虑过要获取用户的邮件,但是如何根据他的邮件而不是Laravel期望的user()向他发送电子邮件?

1 个答案:

答案 0 :(得分:1)

您有两种选择,最简单的选择是使用Signed URLs来允许resend接受用户id参数,然后当用户登录并未经验证,您将他们与他们的resend重定向到id页,以在没有活动用户会话的情况下识别他们的帐户。

例如,您的登录控制器将如下所示:

if (! $user->hasVerifiedEmail()()) {
    return redirect()->to(URL::signedRoute('resend', ['id' => $user->id]));
}

您的VerificationController@resend方法看起来像这样:

public function resend(Request $request)
{
    if ($request->input('id') && $request->hasValidSignature()) {
        $user = User::findOrFail($request->input('id'));
    }

    $user = $user ?: $request->user();

    if ($user->hasVerifiedEmail()) {
        return redirect($this->redirectPath());
    }

    $user->sendEmailVerificationNotification();

    return back()->with('resent', true);
}

也就是说,Laravel包含了需要电子邮件验证的中间件:它确实允许登录,但在用户验证之前它不允许用户做任何事情,除非您有理由完全阻止登录,否则中间件就可以满足您的需求。您可以在中间件here上找到信息。