最直接获取当前登录用户是Auth::user(),但未登录时返回NULL易引发错误;应结合Auth::check()、空安全操作符或optional()安全访问,注意守卫上下文与API/队列等无session场景的特殊处理。

在 laravel 中,获取当前登录用户最直接的方式是调用 Auth::user(),但它在未登录时返回 null,直接使用可能引发「Trying to get Property on null」错误——这是新手最常踩的坑。
Auth::user() 与 auth()->user() 的区别
两者功能完全等价,Auth::user() 是门面调用,auth()->user() 是辅助函数调用,底层都走同一个认证守卫(默认 web)。区别仅在于写法偏好和测试可模拟性:auth() 在单元测试中更易被 Mock 替换。
注意:它们只对已通过 Auth::attempt() 或 session 自动验证的请求有效;API 场景若用 sanctum 或 passport,需确保中间件已正确应用(如 auth:sanctum)。
在 Blade 模板中安全获取用户信息
模板里不能假设用户一定已登录,必须做空值判断。Laravel 提供了便捷的辅助方法:
-
@auth和@guest指令用于条件渲染 -
auth()->check()返回布尔值,适合逻辑分支 -
auth()->id()可直接获取用户 ID(比auth()->user()->id少一次对象访问,且不触发模型加载)
示例:
@auth 欢迎,{{ Auth::user()->name }}!
@else @endauth
在控制器或服务类中避免 NPE(空指针异常)
不要无条件调用 Auth::user()->xxx。推荐以下写法:
- 用
Auth::user()?->name(php 8.0+ 空安全操作符) - 用
optional(Auth::user())->name(兼容旧版 PHP) - 用
Auth::id()获取 ID 后查库(适合需要额外字段或权限校验时) - 在构造函数或方法顶部加
if (!Auth::check()) { abort(401); }显式拒绝未登录访问
特别注意:在队列任务、命令行 Artisan 命令或 API 路由中,Auth::user() 默认为 null,因为这些上下文不携带 session 或 Token,必须显式传入用户 ID 或使用 Auth::loginUsingId() 临时登录。
获取用户时绕不开的守卫(Guard)切换问题
Laravel 允许多守卫共存(如 web、api、admin),但 Auth::user() 默认只查 web 守卫。如果你在 api 路由中调用它,会始终返回 null,除非你指定守卫:
Auth::guard('api')->user()auth('api')->user()- 在
config/auth.php中确认'defaults.guard'是否符合当前场景
常见错误:在 Sanctum API 中忘记加 auth:sanctum 中间件,或前端未正确发送 Authorization: Bearer xxx,导致守卫找不到用户,但错误日志里只显示 null,容易误判为代码问题。
真正复杂的地方不在「怎么取」,而在「从哪个守卫、什么上下文、以什么方式取」——尤其是混合使用 Web + API + 队列时,用户对象的生命周期和作用域边界很容易被忽略。