2016-11-18 83 views
0

我正在使用Laravel 5.3并自定义密码重置电子邮件模板。我做了以下更改,以使用自定义Mailable类创建我自己的HTML电子邮件通知。这是我迄今取得的进展:自定义重置密码电子邮件并在Laravel 5.3中传递用户数据

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可邮寄类:

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类中查询它?有人能告诉我我该怎么做吗?

+0

这不是很清楚。您何时或何时使用此电子邮件通知?我的意思是,你是否在用户密码重置之后使用它?或者你的意思是密码重置电子邮件,其中包含重置密码的链接?我说我可以帮你,但我根本不了解这种情况。 –

+0

感谢您的关注@JulianRodriguez我正在尝试在包含重置密码表单链接的密码重置电子邮件中执行此操作。我用'ForgotPasswordController'更新了我的帖子。基本上我试图将'Notification'替换为'Mailable'类,以便在重置链接邮寄时为此设置不同的html布局。 – Neel

回答

1

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

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

从这里你可以采取2个选项之一:

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

这个解决方案看起来是这样的:

在路由/ web.php

post('password/email', 'Auth\[email protected]') 

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

的应用/ 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上创建了它。

我希望它有帮助!

+0

非常感谢你@ Julian那肯定给了我一个关于我现在如何解决这个问题的想法。非常感谢帮助我...我会尝试使用您的建议更新我的代码。 – Neel

+0

欢迎您先生。 –

相关问题