已登录但无法获取认证用户的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
相关产品推荐
相关产品推荐

