Laravel 8 Jetstream 如何在重置密码后将用户重定向到自定义路由

Laravel 8 Jetstream how to redirect user to custom route after resetting password

我正在使用 Laravel 8 jetstream 进行身份验证。我的问题是,如何在将密码重置为自定义路由后重定向用户?我不想将用户重定向到登录页面。我在所有Fortify中都没有找到路由类;我确定它应该覆盖。

protected $redirectTo

但我不知道我必须在哪个文件中进行此更改。

EDIT: 不建议在vendor中编辑文件,使用BillD的解决方案。

查看 vendor\laravel\fortify\src\Http\Responses\PasswordResetResponse.php

您应该可以修改方法中的响应:

/**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function toResponse($request)
    {
        return $request->wantsJson()
                    ? new JsonResponse(['message' => trans($this->status)], 200)
                    : redirect()->route('login')->with('status', trans($this->status));
    }

以下是我最终在用户提交密码重置操作后重定向回登录路由的操作:

  • 将文件 SuccessfulPasswordResetLinkRequestResponse.php\vendor\laravel\fortify\Http\Responses\ 复制到项目中位于 app\Http\Responses 的文件夹中。

  • 在您的新文件 SuccessfulPasswordResetLinkRequestResponse.php 中,将命名空间更改为:

namespace App\Http\Responses;
  • 打开app\Providers\FortifyServiceProvider.php

  • boot() 函数内添加:

public function boot() 
{
    ...

    $this->app->singleton(SuccessfulPasswordResetLinkRequestResponseContract::class, SuccessfulPasswordResetLinkRequestResponse::class);
}
  • 在同一个 FortifyServiceProvider.php 文件中,添加命名空间:
use App\Http\Responses\SuccessfulPasswordResetLinkRequestResponse;
use Laravel\Fortify\Contracts\SuccessfulPasswordResetLinkRequestResponse as SuccessfulPasswordResetLinkRequestResponseContract;
  • 在您的新 SuccessfulPasswordResetLinkRequestResponse.php 文件中,编辑 toResponse() 函数:
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? new JsonResponse(['message' => trans($this->status)], 200)
            : redirect()->route('login')->with('status', trans($this->status));
    }

这是一个有用的 link,它显示了 Fortify 在撰写本文时使用的所有响应 类: Overriding other Jetstream and Fortify functionality

我在使用 jetstream 时遇到了同样的问题,发现公认的解决方案更好,尤其是当管理员和用户模型都具有重置密码功能时,

您无需在 vendor 中编辑 PasswordResetResponse.php,只需:

  • 复制到App\Http\Responses
  • 然后你可以找到 /vendor/laravel/fortify/routes/routes.php
Route::post('/reset-password', [NewPasswordController::class, 'store'])
->middleware(['guest:' . config('fortify.guard')])
->name('password.update');

指向/laravel/fortify/src/Http/Controllers/NewPasswordController.php

存储函数有默认值PasswordResetResponse.php

public function store(Request $request): Responsable
    {
        $request->validate([
            'token' => 'required',
            Fortify::email() => 'required|email',
            'password' => 'required',
        ]);

    
        $status = $this->broker()->reset(
            $request->only(Fortify::email(), 'password', 'password_confirmation', 'token'),
            function ($user) use ($request) {
                app(ResetsUserPasswords::class)->reset($user, $request->all());

                app(CompletePasswordReset::class)($this->guard, $user);
            }
        );

        return $status == Password::PASSWORD_RESET
            ? app(PasswordResetResponse::class, ['status' => $status])
            : app(FailedPasswordResetResponse::class, ['status' => $status]);
    }

所以只需要更改 NewPasswordController.php 文件中的命名空间,使其指向您创建的 PasswordResetResponse.php。

use Laravel\Fortify\Contracts\PasswordResetResponse; 
 To--
use App\Http\Responses\PasswordResetResponse;