You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在响应中显示密码重置链接?修改代码后遇500错误

密码重置接口返回Token时出现500错误的原因及修复

错误原因

  • 变量重名与引用冲突:你在闭包中写了function ($user, $token) use (&$token),这里闭包的参数$token和use引入的外部$token重名,PHP会因变量作用域冲突抛出致命错误。
  • 变量未定义风险:当$status不等于Password::RESET_LINK_SENT(比如请求的邮箱不存在)时,闭包不会执行,此时外部的$token变量未被定义,后续在响应中访问md5($token)会触发“未定义变量”的致命错误。

修复方案

方案1:通过外部变量捕获Token

修改闭包的引用变量名避免重名,同时提前初始化变量防止未定义:

// 提前初始化变量,避免未定义报错
$resetToken = null;

$status = Password::sendResetLink(
    $request->only('email'),
    function ($user, $token) use (&$resetToken) {
        $hashedToken = md5($token);
        // 将哈希后的Token赋值给外部变量
        $resetToken = $hashedToken;
        
        (\DB::table('password_resets')
            ->updateOrInsert(
                ['email' => $user->email],
                [
                    'token' => $hashedToken
                ]
            ))
            ? $user->sendPasswordResetNotification($hashedToken)
            : null;
    }
);

if ($request->expectsJson()) {
    if ($status === Password::RESET_LINK_SENT) {
        return response()->json([
            'message' => __($status),
            'token' => $resetToken,
            // 如需完整重置链接,可拼接页面地址
            'link' => url('/password/reset/' . $resetToken . '?email=' . urlencode($request->email))
        ], 200);
    } else {
        return response()->json(['message' => __($status)], 422);
    }
}

return $status === Password::RESET_LINK_SENT
    ? back()->with(['status' => __($status)])
    : back()->withErrors(['email' => __($status)]);

方案2:直接从数据库查询Token

这种方式不依赖闭包变量传递,直接从数据库读取已存储的Token,可靠性更高:

$email = $request->input('email');

$status = Password::sendResetLink(
    $request->only('email'),
    function ($user, $token) {
        $hashedToken = md5($token);
        
        (\DB::table('password_resets')
            ->updateOrInsert(
                ['email' => $user->email],
                [
                    'token' => $hashedToken
                ]
            ))
            ? $user->sendPasswordResetNotification($hashedToken)
            : null;
    }
);

if ($request->expectsJson()) {
    if ($status === Password::RESET_LINK_SENT) {
        // 从数据库查询对应邮箱的重置Token
        $resetToken = \DB::table('password_resets')->where('email', $email)->value('token');
        
        return response()->json([
            'message' => __($status),
            'token' => $resetToken,
            'link' => url('/password/reset/' . $resetToken . '?email=' . urlencode($email))
        ], 200);
    } else {
        return response()->json(['message' => __($status)], 422);
    }
}

return $status === Password::RESET_LINK_SENT
    ? back()->with(['status' => __($status)])
    : back()->withErrors(['email' => __($status)]);

内容的提问来源于stack exchange,提问作者Yunus Emre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:10:42