【问题标题】:Customise Reset Password Email and pass User Data in Laravel 5.3在 Laravel 5.3 中自定义重置密码电子邮件并传递用户数据
【发布时间】:2017-04-02 16:02:42
【问题描述】:

我正在使用 Laravel 5.3 并自定义密码重置电子邮件模板。我已经完成了以下更改,以使用自定义 Mailable 类为通知创建自己的 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));
}

ResetPassword Mailable 类:

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 类中查询它?有人可以告诉我如何做到这一点吗?

【问题讨论】:

  • 这对我来说不是很清楚。您在何时何地使用此电子邮件通知?我的意思是,您是在重置用户密码后使用它吗?或者您的意思是包含重置密码链接的密码重置电子邮件?我相信我可以帮助你,但我完全不理解这种情况。
  • 感谢您查看@JulianRodriguez 我正在尝试在密码重置电子邮件中执行此操作,其中包含重置密码表单的链接。我已经用ForgotPasswordController 更新了我的帖子。基本上,我正在尝试将 Notification 替换为 Mailable 类,以便在邮寄重置链接时可以使用不同的 html 布局。

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


【解决方案1】:

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

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

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

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

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

在路由/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 上拥有它。

希望对你有帮助!

【讨论】:

  • 非常感谢@Julian 这当然让我知道我现在应该如何处理这个问题。非常感谢帮助我...我现在会尝试根据您的建议更新我的代码。
猜你喜欢
  • 2017-12-19
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多