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

已登录但无法获取认证用户的Laravel技术问题求助

问题分析与解决方案

核心问题

你手动实例化AuthController调用user()方法时,没有经过sanctum中间件的认证流程,导致$request->user()返回null,进而出现“Attempt to read property 'id' on null”的错误。AuthController的user()方法依赖sanctum中间件对请求的处理(从Cookie/Header中提取Token并验证用户身份),直接实例化控制器调用方法时,中间件不会自动执行。

修复方案

不要手动调用控制器方法,直接使用Laravel的认证守卫来检查用户是否已认证,代码更简洁且可靠:

修改bookingInitiate方法

public function bookingInitiate(Request $request)
{
    // 直接通过sanctum守卫获取认证用户,自动处理Cookie/Header中的Token
    $authenticatedUser = auth('sanctum')->user();

    if ($authenticatedUser) {
        // 用户已认证,执行相关操作
        return new UserResource($authenticatedUser);
    } else {
        // 用户未认证,执行未登录逻辑
        return response()->json(['error' => 'User is not authenticated'], 401);
    }
}

为什么原来的方式不行?

  • AuthController的user()方法中,$request->user()的值是由sanctum中间件在路由层面处理后注入的。
  • 当你直接new AuthController()调用方法时,中间件没有被触发,$request对象并没有经过认证处理,所以$request->user()返回null。

额外提示

如果你的预订接口需要同时支持认证和未认证用户,上面的代码已经完全满足需求:

  • 登录用户的请求会自动携带Cookie中的Token,auth('sanctum')->user()会返回对应的用户实例。
  • 未登录用户的请求会返回null,进入未认证分支。

内容的提问来源于stack exchange,提问作者youHaveAlsoBeenABeginner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:48:18