请教点击重置密码按钮后,email 是怎么传递到页面上去的?

请问,我点击重置密码按钮后,始终无法在弹出的页面上自动填写上相对应的email,我看教程的截图上也没有显示,以前也没有人有解答过,不知道这里应该如何处理?谢谢。

file

file

日拱一卒
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

看GitHub上的issue,Password reset e-mail missing e-mail in URL #15733
showResetForm传递的email是旧版本遗留的,新版本不建议传email值到视图,而是让用户填写email,所以建议是把showResetForm的email传值删除。

5年前 评论
讨论数量: 8

这个问题当时也让我琢磨了很久,今天看@tsin 的答案让我成功解决了这个问题

app/Notifications/ResetPassword.php

·
·
·
public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('重置密码')
            ->line('这是一封密码重置邮件,如果是您本人操作,请点击以下按钮继续:')
            ->action('重置密码', url(route('password.reset', [$this->token, 'email=' . encrypt($notifiable->email)], false)))
            ->line('如果您并没有执行此操作,您可以选择忽略此邮件。');
    }

app/Models/User.php 中添加方法

use App\Notifications\ResetPassword;
·
·
·
public function sendPasswordResetNotification($token)
    {
        $this->notify(new ResetPassword($token));
    }

修改视图文件 resources/views/auth/passwords/reset.blade.php

<div class="form-group">
    <label for="email" class="col-md-4 control-label">邮箱地址:</label>
        <div class="col-md-6">
            <input id="email" type="email" class="form-control" name="email"
                 value="{{decrypt($email)}}" readonly>
        </div>
</div>

file

5年前 评论

额,我贡献过回答,有人问过同样的问题

ResetPasswordController 中重写 showResetForm 方法,通过 token 到数据库中查找相应的 email ,然后将参数传递到前端。

5年前 评论

@doderic 谢谢,我也想到这个办法了,但email链接中的TOKEN和数据库password_resets表中的token并不相同,中间还需要进行什么转化么?谢谢

5年前 评论

看GitHub上的issue,Password reset e-mail missing e-mail in URL #15733
showResetForm传递的email是旧版本遗留的,新版本不建议传email值到视图,而是让用户填写email,所以建议是把showResetForm的email传值删除。

5年前 评论

@tsin 谢谢,这个链接好有用,我研究一下

5年前 评论

这个问题当时也让我琢磨了很久,今天看@tsin 的答案让我成功解决了这个问题

app/Notifications/ResetPassword.php

·
·
·
public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject('重置密码')
            ->line('这是一封密码重置邮件,如果是您本人操作,请点击以下按钮继续:')
            ->action('重置密码', url(route('password.reset', [$this->token, 'email=' . encrypt($notifiable->email)], false)))
            ->line('如果您并没有执行此操作,您可以选择忽略此邮件。');
    }

app/Models/User.php 中添加方法

use App\Notifications\ResetPassword;
·
·
·
public function sendPasswordResetNotification($token)
    {
        $this->notify(new ResetPassword($token));
    }

修改视图文件 resources/views/auth/passwords/reset.blade.php

<div class="form-group">
    <label for="email" class="col-md-4 control-label">邮箱地址:</label>
        <div class="col-md-6">
            <input id="email" type="email" class="form-control" name="email"
                 value="{{decrypt($email)}}" readonly>
        </div>
</div>

file

5年前 评论

@ishu 感谢感谢,根据你的方法,我成功实现了这个功能。

5年前 评论

@ishu 的方法不错,不过会变成多重提示,我是在 vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php 源码中添加了一个success

    protected function rules()
    {
        return [
            'token' => 'required',
            'email' => 'required|email',
            'password' => 'required|confirmed|min:6',
        ];
    }

这里可以修改验证规则,我把密码最小长度改成了6位

    protected function resetPassword($user, $password)
    {
        $this->setUserPassword($user, $password);

        $user->setRememberToken(Str::random(60));

        $user->save();

        event(new PasswordReset($user));

        session()->flash('success','重置密码成功');
        $this->guard()->login($user);
    }

在登录前添加一个session就可以了

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!