首页 文章

在Laravel 5.4中自定义忘记密码电子邮件

提问于
浏览
4

我正在尝试在Laravel中自定义密码重置电子邮件 .

我必须覆盖此功能:

namespace Illuminate\Auth\Passwords;

use Illuminate\Auth\Notifications\ResetPassword as ResetPasswordNotification;
use Illuminate\Http\Request;


trait CanResetPassword
{
    /**
     * Get the e-mail address where password reset links are sent.
     *
     * @return string
     */
    public function getEmailForPasswordReset()
    {
        return $this->email;
    }

    /**
     * Send the password reset notification.
     *
     * @param  string  $token
     * @return void
     */

public function sendPasswordResetNotification($token)
{

    $this->notify(new ResetPasswordNotification($token));

}

这是我的尝试:

public function sendPasswordResetNotification($token, Requests $request)
{
Mail::to($request->email)->send(new newpassword($token));
}

我收到此错误:

Illuminate声明\ Foundation \ Auth \ User :: sendPasswordResetNotification($ token,Illuminate \ Http \ Request $ request)必须与Illuminate \ Contracts \ Auth \ CanResetPassword :: sendPasswordResetNotification($ token)兼容

2 回答

  • 6

    我很惊讶你要花那么长时间来定制电子邮件 .

    试试这个:

    php artisan vendor:publish
    

    然后在这里修改文件

    /resources/views/vendor/notifications/email.blade.php
    

    适合我们的使用 .

    user@default:~/laravel_5.4$ php artisan vendor:publish
    Copied Directory [/vendor/laravel/framework/src/Illuminate/Pagination/resources/views] To [/resources/views/vendor/pagination]
    Copied Directory [/vendor/laravel/framework/src/Illuminate/Notifications/resources/views] To [/resources/views/vendor/notifications]
    Copied Directory [/vendor/laravel/framework/src/Illuminate/Mail/resources/views] To [/resources/views/vendor/mail]
    Publishing complete.
    

    现在,如果您需要更改副本并且您想要原始ResetPassword类使用的花哨按钮,则可以在User.php类中扩展邮件类,如下例所示 .

    这是我们的副本,仅作为示例:

    <?php
    
    namespace App;
    
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Auth\Notifications\ResetPassword;
    use Illuminate\Notifications\Messages\MailMessage;
    
    class User extends Authenticatable
    {
        use Notifiable;
    
        protected $table = 'Users';
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = [
            'firstName',
            'lastName',
            'email',
            'password',
        ];
    
        /**
         * The attributes that should be hidden for arrays.
         *
         * @var array
         */
        protected $hidden = [
            'password', 'remember_token',
        ];
    
        /**
         * Sends the password reset notification.
         *
         * @param  string $token
         *
         * @return void
         */
        public function sendPasswordResetNotification($token)
        {
            $this->notify(new CustomPassword($token));
        }
    }
    
    class CustomPassword extends ResetPassword
    {
        public function toMail($notifiable)
        {
            return (new MailMessage)
                ->line('We are sending this email because we recieved a forgot password request.')
                ->action('Reset Password', url(config('app.url') . route('password.reset', $this->token, false)))
                ->line('If you did not request a password reset, no further action is required. Please contact us if you did not submit this request.');
        }
    }
    
  • 7

    如果你读错了,它会告诉你你的 class 与 CanResetPassword 不兼容 . 如果你看那......

    interface CanResetPassword
    {
        /**
         * Get the e-mail address where password reset links are sent.
         *
         * @return string
         */
        public function getEmailForPasswordReset();
        /**
         * Send the password reset notification.
         *
         * @param  string  $token
         * @return void
         */
        public function sendPasswordResetNotification($token);
    }
    

    您可以看到函数 sendPasswordResetNotification 应该只接受一个参数 $token . 因此,您需要从方法的签名中删除 Request $request 作为参数 .

    要获取请求,您需要在 sendPasswordResetNotification 方法中使用函数 request() .

    public function sendPasswordResetNotification($token)
    {
        Mail::to(request()->email)->send(new newpassword($token));
    }
    

相关问题