自定义重置密码电子邮件并在 Laravel 5.3 中传递用户数据

Customise Reset Password Email and pass User Data in Laravel 5.3

我正在使用 Laravel 5.3 并自定义密码重置电子邮件模板。我进行了以下更改,以使用自定义 Mailable class 创建我自己的 html 通知电子邮件。这是我目前的进度:

忘记密码控制器:

public function postEmail(Request $request)
    {
        $this->validate($request, ['email' => 'required|email']);

        $response = Password::sendResetLink($request->only('email'), function (Message $message) {
            $message->subject($this->getEmailSubject());
        });

        switch ($response) {
            case Password::RESET_LINK_SENT:
                return Response::json(['status' => trans($response)], 200);

            case Password::INVALID_USER:
                return Response::json(['email' => trans($response)], 400);
        }
    }

用户模型:

public function sendPasswordResetNotification($token)
{
    Mail::queue(new ResetPassword($token));
}

重置密码可邮寄 Class:

protected $token;

public function __construct($token)
{
    $this->token = $token;
}

public function build()
{
    $userEmail = 'something'; // How to add User Email??
    $userName = 'Donald Trump'; // How to find out User's Name??
    $subject = 'Password Reset';

    return $this->view('emails.password')
                ->to($userEmail)
                ->subject($subject)
                ->with([
                        'token'   => $this->token
                        'userEmail' => $userEmail,
                        'userName'  => $userName
                      ]);
    }   

如果您在上面注意到,我不确定如何传递用户名并找出用户的电子邮件地址。我需要从用户模型发送此数据还是从 Mailable class 查询它?有人可以告诉我该怎么做吗?

通常您会要求提供用户电子邮件以发送重置密码电子邮件,该电子邮件应作为请求参数发送给您的路由控制器。

默认情况下,L5.3 使用post('password/email) 路由来处理重设密码请求。此路由执行 App\Http\Controllers\Auth\ForgotPasswordController 使用的 'SendsPasswordResetEmails' 特征中定义的 sendResetLinkEmail 方法。

从这里您可以选择以下 2 个选项之一:

1st:您可以覆盖路由以调用同一控制器(或任何其他控制器,在本例中可能是您​​的 postEmail 函数)中的另一个函数,该函数通过您的电子邮件搜索用户模型收到,然后您可以将用户模型作为函数参数传递给执行队列邮件操作的方法(这可能需要也可能不需要覆盖 SendsPasswordResetEmails,取决于您如何处理重置密码方法)。

这个解决方案看起来像这样:

在routes/web.php

post('password/email', 'Auth\ForgotPasswordController@postEmail')

在app/Mail/passwordNotification.php(例如)

protected $token;
protected $userModel;

public function __construct($token, User $userModel)
{
    $this->token = $token;
    $this->userModel = $userModel;
}

public function build()
{
    $userEmail = $this->userModel->email;
    $userName = $this->userModel->email
    $subject = 'Password Reset';

    return $this->view('emails.password')
                ->to($userEmail)
                ->subject($subject)
                ->with([
                        'token'   => $this->token
                        'userEmail' => $userEmail,
                        'userName'  => $userName
                      ]);
    }  

在app/Http/Controllers/Auth/ForgotPasswordController

public function postEmail(Request $request)
    {
        $this->validate($request, ['email' => 'required|email']);
        $userModel = User::where('email', $request->only('email'))->first();
        Mail::queue(new ResetPassword($token));
        //Manage here your response
    }

第二:您可以覆盖特征 SendsPasswordResetEmails 以通过电子邮件搜索用户模型,并在 sendResetLinkEmail 函数中使用您的自定义函数。在那里您可以使用您的函数,但请注意您仍然必须以某种方式处理状态以创建响应,因为您已经在 ForgotPasswordController 上拥有它。

希望对您有所帮助!