如何让Laravel Fortify密码确认路由返回预期JSON响应
Laravel Fortify 确认密码路由自定义JSON响应实现方案
Fortify 中PasswordConfirmedResponse、FailedPasswordConfirmationResponse两个空接口本身就是预留的自定义扩展点,不需要重写控制器、覆盖默认路由,直接通过容器绑定自定义实现即可满足JSON返回需求,具体操作如下:
- 第一步:创建自定义响应类
在app/Http/Responses目录下新建两个响应类,分别实现Fortify提供的对应契约接口,在toResponse方法中判断请求类型,区分返回JSON或页面跳转响应:- 密码确认成功响应类
<?php namespace App\Http\Responses; use Illuminate\Http\JsonResponse; use Laravel\Fortify\Contracts\PasswordConfirmedResponse as ConfirmResponseContract; class PasswordConfirmedResponse implements ConfirmResponseContract { public function toResponse($request) { return $request->wantsJson() ? new JsonResponse(['message' => '密码验证通过'], 200) : back()->with('status', 'password-confirmed'); } }- 密码确认失败响应类
<?php namespace App\Http\Responses; use Illuminate\Http\JsonResponse; use Illuminate\Validation\ValidationException; use Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse as FailedConfirmContract; class FailedPasswordConfirmationResponse implements FailedConfirmContract { public function toResponse($request) { $errorMsg = '输入的密码与当前账户密码不匹配'; if ($request->wantsJson()) { throw ValidationException::withMessages([ 'password' => [$errorMsg] ]); } return back() ->withInput($request->only('password')) ->withErrors(['password' => $errorMsg]); } } - 第二步:绑定接口到自定义实现
打开app/Providers/FortifyServiceProvider.php,在boot方法中添加容器绑定逻辑,将Fortify默认的响应契约指向你刚写的自定义类:<?php namespace App\Providers; use App\Http\Responses\FailedPasswordConfirmationResponse; use App\Http\Responses\PasswordConfirmedResponse; use Illuminate\Support\ServiceProvider; use Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse as FailedContract; use Laravel\Fortify\Contracts\PasswordConfirmedResponse as ConfirmContract; class FortifyServiceProvider extends ServiceProvider { public function boot() { // 原有Fortify配置逻辑保留,比如Fortify::createUsersUsing()等 $this->app->singleton(ConfirmContract::class, PasswordConfirmedResponse::class); $this->app->singleton(FailedContract::class, FailedPasswordConfirmationResponse::class); } }
完成以上配置后,/user/confirm-password路由会自动适配请求类型:普通页面请求保持原有跳转+闪存消息的逻辑,XHR/携带Accept: application/json头的请求会返回对应JSON格式结果,无需修改框架源码、无需覆盖默认路由定义。
内容的提问来源于stack exchange,提问作者liam-milbel
相关产品推荐
相关产品推荐

