在Laravel中获取Auth用户ID

时间:2015-11-02 21:01:13

标签: php session laravel

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

Auth::user()->id

在我之前的应用程序(不是laravel)中,当用户登录时,我正在为userid注册会话。我正在检查$ _SESSION ['user_id']是否可用。

我想问一下,当我调用Auth::user()->id时,是否为每个请求生成了sql查询?如果它确实对性能不利。

我应该注册一个像

这样的新会话
Session::put('user_id', Auth::user()->id);

表现。

或Auth:user() - > id是最佳选择吗?

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:0)

这不是一个真正的答案,但它打算展示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 logging feature,我得到了:

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