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

如何让Laravel Fortify密码确认路由返回预期JSON响应

Laravel Fortify 确认密码路由自定义JSON响应实现方案

Fortify 中PasswordConfirmedResponse、FailedPasswordConfirmationResponse两个空接口本身就是预留的自定义扩展点,不需要重写控制器、覆盖默认路由,直接通过容器绑定自定义实现即可满足JSON返回需求,具体操作如下:

  • 第一步:创建自定义响应类
    在app/Http/Responses目录下新建两个响应类,分别实现Fortify提供的对应契约接口,在toResponse方法中判断请求类型,区分返回JSON或页面跳转响应:
    1. 密码确认成功响应类
    <?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');
        }
    }
    
    1. 密码确认失败响应类
    <?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 09:51:30