laravel中auth()->user()最简单直接获取已登录用户模型,未登录返回null;推荐用auth()->id()替代获取id以提升性能,多guard需显式指定如auth('admin')->id()。

在 Laravel 控制器里直接用 auth()->user() 最简单
只要用户已登录,auth()->user() 就返回当前认证的用户模型实例;没登录时返回 null。这是最常用、最轻量的方式,不需要额外注入或依赖。
常见错误是直接调用 Auth::user() 却忘了引入门面——其实不用 use Auth;,因为 auth() 是全局辅助函数,更安全也更推荐。
- 如果控制器方法需要确保用户已登录,优先用中间件:
middleware('auth'),而不是手动判空 - 在 API 路由中(比如用 Sanctum 或 Passport),
auth()->user()依然有效,但前提是请求带了合法 token - 别在构造函数里调用它——Laravel 的控制器构造函数执行时,认证服务可能还没完全初始化,容易返回
null
request()->user() 和 $this->user() 也能用,但有前提
request()->user() 本质是转发到当前 guard 的 user() 方法,和 auth()->user() 行为一致,但多了一层调用开销;$this->user() 只在继承了 Illuminate\Routing\Controller 的控制器里可用(Laravel 默认就是),且仅限于已通过 auth 中间件认证过的请求。
这两个写法不是不能用,但没必要刻意替换 auth()->user() ——除非你在写测试 mock 请求对象,或者统一处理 request 层逻辑。
-
request()->user()在未登录时也返回null,行为一致 -
$this->user()在没走auth中间件时会报错:Call to a member function user() on null,因为底层依赖$this->request属性 - 所有方式拿到的都是 Eloquent 模型,可直接链式调用关系:
auth()->user()->posts
想拿 ID 而不是整个用户?用 auth()->id() 更高效
如果只需要用户 ID(比如做日志记录、查询关联数据),别调 auth()->user()->id——这会触发一次完整模型加载,哪怕你只想要一个整数。
auth()->id() 直接从 session 或 token 中读取 ID,不查数据库,也不实例化模型,性能更好,也更安全(避免因模型被软删除或状态异常导致意外)。
-
auth()->id()返回int或null,注意判空 - 在队列任务或非 HTTP 上下文中(如命令行),
auth()不可用,得换方案(比如传入 ID 作为参数) - 多 guard 场景下(如
adminguard),记得指定:auth('admin')->id()
为什么有时 auth()->user() 返回 null,明明用户已登录?
最常见原因是 guard 配置不匹配:比如你用的是 sanctum,但代码里调的是默认 web guard,或者中间件用了 auth:sanctum,控制器里却没显式指定 guard。
另一个隐蔽问题是 session 驱动问题——在 CLI 环境、队列、或某些 Docker/NGINX 配置下,session cookie 可能没正确传递或存储,导致认证态丢失。
- 检查当前 guard:
auth()->getDefaultDriver(),再核对中间件和配置是否一致 - API 请求务必确认 header 带了
Authorization: Bearer xxx,且 token 有效、未过期 - 在
config/auth.php里看'defaults' => ['guard' => 'web']是否符合预期











