在 Laravel 中获取认证用户 ID

7

如果用户登录 Laravel 5.1,我们可以访问用户 ID。

Auth::user()->id

在我的之前的应用程序(不是 Laravel)中,当用户登录时,我为用户ID注册了一个会话,并检查 $_SESSION['user_id'] 是否可用。
我想问一下,当我调用 Auth::user()->id 时,它是否会为每个请求生成一个 SQL 查询?如果是这样,那么它对性能不利。
我是否应该像这样注册一个新的会话:
Session::put('user_id', Auth::user()->id);

为了提高性能。

还是 Auth:user()->id 是最好的选择?

2个回答

17

您可以使用Auth :: id()。 这会从会话中获取它。 如果会话中不存在,则会运行查询并从数据库中获取它。


当用户登录时,Laravel是否会为用户ID注册会话? - Cihan Küsmez
是的,它会这样做。当您登录时,它会触发此行代码 $this->updateSession($user->getAuthIdentifier()); - Thomas Kim
1
这不是真的,它总是执行查询。 - user151496

4

这不是一个真正的答案,但它旨在展示Auth::id()如何工作。将以下路由添加到您的web.php中:

Route::get('/fake', function () {
  \DB::enableQueryLog();
  Auth::id();
  dump(\DB::getQueryLog());
});

现在,导航到/fake,会得到类似以下的结果:
array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `users` where `id` = ? limit 1"
    "bindings" => array:1 [▼
      0 => 284
    ]
    "time" => 15.37
  ]
]

我反复尝试了很多次,似乎 Auth::id() 总是查询数据库,而没有将结果缓存到会话中(我使用的是 Laravel 5.6、PHP 7.2.3 和 MariaDB 10.2.14)。
为了确认,我还启用了 MariaDB 日志记录功能,并得到了以下结果:
180611 12:08:10    77 Connect   user@localhost as anonymous on dbname
           77 Query use `dbname`
           77 Prepare   set names 'utf8mb4' collate 'utf8mb4_unicode_ci'
           77 Execute   set names 'utf8mb4' collate 'utf8mb4_unicode_ci'
           77 Close stmt    
           77 Prepare   set time_zone="+04:30"
           77 Execute   set time_zone="+04:30"
           77 Close stmt    
           77 Prepare   set session sql_mode='NO_ENGINE_SUBSTITUTION'
           77 Execute   set session sql_mode='NO_ENGINE_SUBSTITUTION'
           77 Close stmt    
           77 Prepare   select * from `users` where `id` = ? limit 1
           77 Execute   select * from `users` where `id` = 284 limit 1
           77 Close stmt    
           77 Quit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接