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;
我正在使用 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;