
本文详解如何通过绑定自定义响应类,使 Laravel Fortify 的 /user/confirm-password 路由在 XHR 请求时返回标准 JSON 响应,而非默认重定向,从而适配 SPA 或 API 驱动的前端交互。
本文详解如何通过绑定自定义响应类,使 laravel fortify 的 `/user/confirm-password` 路由在 xhr 请求时返回标准 json 响应,而非默认重定向,从而适配 spa 或 api 驱动的前端交互。
Laravel Fortify 默认将密码确认逻辑封装在 ConfirmablePasswordController@store 方法中,其响应行为依赖两个契约接口:PasswordConfirmedResponse 和 FailedPasswordConfirmationResponse。值得注意的是,这两个接口本身不包含任何方法定义,而是作为服务容器绑定的“标记接口”(marker interfaces),实际响应逻辑由其实现类的 toResponse($request) 方法决定——这正是我们自定义的关键入口。
要实现 XHR 请求返回 JSON、普通请求跳转回原页面的双模式响应,需在 FortifyServiceProvider 的 register() 方法中显式绑定自定义实现类。以下是推荐的完整实现:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
// app/Providers/FortifyServiceProvider.php
use Laravel\Fortify\Contracts\PasswordConfirmedResponse;
use Laravel\Fortify\Contracts\FailedPasswordConfirmationResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Redirect;
public function register()
{
$this->app->instance(PasswordConfirmedResponse::class, new class implements PasswordConfirmedResponse {
public function toResponse($request)
{
if ($request->wantsJson()) {
return new JsonResponse(['success' => true, 'message' => 'Password confirmed.'], 200);
}
return Redirect::back()->with('status', 'password_confirmed');
}
});
$this->app->instance(FailedPasswordConfirmationResponse::class, new class implements FailedPasswordConfirmationResponse {
public function toResponse($request)
{
if ($request->wantsJson()) {
return new JsonResponse([
'success' => false,
'message' => 'Invalid password.'
], 422);
}
return Redirect::back()->withErrors(['password' => 'The provided password is incorrect.']);
}
});
}✅ 关键要点说明:
- new class implements XxxResponse 是 PHP 的匿名类语法,避免创建独立文件,适合轻量定制;
- request->wantsJson() 自动识别 Accept: application/json 或 X-Requested-With: XMLHttpRequest 头,精准判断 AJAX 请求;
- 成功响应建议返回 200 OK,失败响应推荐使用语义化状态码(如 422 Unprocessable Entity);
- 若项目已启用 Laravel Sanctum 或 API 认证,请确保 CSRF token 在 AJAX 请求中正确传递(例如通过 X-XSRF-TOKEN 头);
- 修改后务必运行 php artisan config:clear 清除配置缓存,确保绑定生效。
通过此方式,你无需重写控制器或发布 Fortify 的视图,即可无缝集成现代前端框架(如 Vue、React、Inertia)所需的 JSON 接口行为,兼顾用户体验与架构一致性。

















