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

时间:2016-11-18 17:55:03

标签: laravel laravel-5 laravel-5.3 laravel-mail

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

ForgotPasswordController:

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));
}

ResetPassword Mailable 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类查询?有人能告诉我怎么能这样做吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

在routes / web.php中

post('password/email', 'Auth\ForgotPasswordController@postEmail')
/ app / 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上有它一样。

我希望它有所帮助!