如何在 Laravel 5.2 中手动发送密码重置请求?

Posted

技术标签:

【中文标题】如何在 Laravel 5.2 中手动发送密码重置请求?【英文标题】:How do I manually send a password reset request in Laravel 5.2? 【发布时间】:2016-12-18 17:56:29 【问题描述】:

我想从控制器内手动向特定用户(不是当前登录的用户)发送密码重置请求。我在 Laravel 代码中进行了一些挖掘,似乎我应该在 ResetsPasswords 中调用 postEmail(Request $request),但我似乎无法弄清楚如何访问正确的 PasswordController 实例来调用它。

【问题讨论】:

您是否尝试过通过在控制器中执行use ResetsPasswords; 来包含该特征,然后从该特征调用相关方法? @Jonathon 是的。我用过use ResetsPasswords;$this->postEmail($request);。没有输出;既没有错误也没有成功,但我从未收到过电子邮件。 更新你的 auth.php 配置文件驱动 【参考方案1】:

为什么不给你的控制器做这样的事情:

<?php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\Request;
use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Password;

class YourController extends Controller

    public function sendEmail()
    
        $credentials = ['email' => $email_address];
        $response = Password::sendResetLink($credentials, function (Message $message) 
            $message->subject($this->getEmailSubject());
        );

        switch ($response) 
            case Password::RESET_LINK_SENT:
                return redirect()->back()->with('status', trans($response));
            case Password::INVALID_USER:
                return redirect()->back()->withErrors(['email' => trans($response)]);
        
    

你并没有真正解释你想如何发送这个的上下文,所以相应地调整。

【讨论】:

谢谢 - 这让我走上了正轨!我刚刚编辑了帖子以明确 sendResetLink 的第一个参数应该是['email' =&gt; $email_address] 形式的数组 太棒了,很高兴听到! 你救了我的命,伙计! 我遇到了一些错误。 “路由 [password.reset] 未定义”。 效果很好。【参考方案2】:

感谢 Mariusz Kurman,我只在他的回答中添加了令牌。这很好用:

$user = User::where('email', request()->input('email'))->first();
$token = Password::getRepository()->create($user);
$user->sendPasswordResetNotification($token);

【讨论】:

【参考方案3】:

完全控制 Laravel 5.5:

    $user = User::where('email', request()->input('email'))->first();
    $token = Password::getRepository()->create($user);

    Mail::send(['text' => 'emails.password'], ['token' => $token], function (Message $message) use ($user) 
        $message->subject(config('app.name') . ' Password Reset Link');
        $message->to($user->email);
    );

【讨论】:

为密码干杯::getRepository()->create();此外,这也适用于 5.4。 与@SuperNOVA 相同:谢谢,它也适用于 5.8。 这里是链接 href 放入邮件中: route('nova.password.reset', ['token' =&gt; $token ]) @kjdion84 为什么是Password::getRepository()-&gt;create($user) 而不仅仅是Password::createToken($user) - 见src github.com/laravel/framework/blob/5.4/src/Illuminate/Auth/…【参考方案4】:

最简单的方法:

    $token = Str::random(60);
    $user = User::where('email', request()->input('email'))->first();
    $user->sendPasswordResetNotification($token);

@Doc's bottom

如果您想手动编辑您的电子邮件:

    php artisan vendor:publish

选择“11” 给你:

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

【讨论】:

您正在使用未在任何地方定义的“$token”变量。【参考方案5】:

使用此代码发送密码重置链接。这里我是 API 路由

  $this->validate($request, [
        'user_id'    => 'required|int',
    ]);

    $user =  User::find($request->user_id);
    if( $user )
    
        $credentials = ['email' => $user->email];
        $response = Password::sendResetLink($credentials, function (Message $message) 
            $message->subject($this->getEmailSubject());
        );

        switch ($response) 
            case Password::RESET_LINK_SENT:
                return response()->json([
                    'status'        => 'success',
                    'message' => 'Password reset link send into mail.',
                    'data' =>''], 201);
            case Password::INVALID_USER:
                return response()->json([
                    'status'        => 'failed',
                    'message' =>   'Unable to send password reset link.'
                ], 401);
          
    
    return response()->json([
        'status'        => 'failed',
        'message' =>   'user detail not found!'
    ], 401);

对于网页视图:

$response = Password::sendResetLink($credentials, function (Message $message) 
            $message->subject($this->getEmailSubject());
        );

       switch ($response) 
            case Password::RESET_LINK_SENT:
                return redirect()->back()->with('status', trans($response));
            case Password::INVALID_USER:
                return redirect()->back()->withErrors(['email' => trans($response)]);
        

【讨论】:

以上是关于如何在 Laravel 5.2 中手动发送密码重置请求?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 手动生成重置密码令牌:收到错误“此密码重置令牌无效”

如何在 Laravel 5 中更改默认重置密码链接

如何使用 laravel 5 中的队列通过电子邮件发送密码重置链接

Laravel 5.2 忘记密码的模式弹出窗口显示 500 内部服务器错误,同时运行 ajax 功能

无法在 laravel 5.3 中发送密码重置链接?

laravel 5.4 密码重置问题——发送邮件