如何在Laravel中获取当前用户登录时间并计算登录时长(优先不使用Events)
获取Laravel当前用户登录时间并计算已过秒数(非Events实现)
嘿,我来给你分享个不用Events就能搞定的方案,完美解决你要获取当前用户登录时间、计算登录后已过去秒数的需求~
第一步:给用户表添加登录时间字段
Laravel默认的用户表没有存储登录时间的字段,所以咱们先给users表加个last_login_at字段:
- 生成迁移文件:
php artisan make:migration add_last_login_at_to_users_table --table=users - 打开生成的迁移文件,在
up方法里添加字段:public function up() { Schema::table('users', function (Blueprint $table) { $table->timestamp('last_login_at')->nullable(); }); } - 执行迁移,把字段加到数据库里:
php artisan migrate
第二步:用户登录时更新登录时间
不用Events的话,咱们直接在登录控制器里重写authenticated方法,用户登录成功后就更新这个字段:
打开app/Http/Controllers/Auth/LoginController.php,添加下面的方法:
use Illuminate\Http\Request; protected function authenticated(Request $request, $user) { // 更新当前用户的登录时间为当前时间 $user->update([ 'last_login_at' => now() ]); }
如果是你自己写的自定义登录逻辑,那就在验证用户账号密码通过后,直接调用$user->update(['last_login_at' => now()])就行,原理是一样的。
第三步:计算登录后已过去的秒数
现在只要用户登录过,last_login_at就有值了,咱们可以在控制器、视图或者任何需要的地方计算已过秒数:
在控制器里使用:
use Illuminate\Support\Facades\Auth; use Carbon\Carbon; // 先确保用户已登录 if (Auth::check()) { // 解析登录时间为Carbon实例 $loginTime = Carbon::parse(Auth::user()->last_login_at); // 计算和当前时间的秒数差 $elapsedSeconds = $loginTime->diffInSeconds(now()); // 现在$elapsedSeconds就是登录后已过去的秒数啦 }
在Blade视图里直接显示:
@auth 你已经登录了 {{ Carbon\Carbon::parse(auth()->user()->last_login_at)->diffInSeconds(now()) }} 秒 @endauth
额外补充(可选)
如果你的项目开启了「记住登录」功能,用户下次自动登录时也想更新登录时间的话,可以自定义一个中间件,在用户通过记住登录自动认证时更新last_login_at。不过如果只是需要普通登录的时间,上面的步骤完全够用啦~
内容的提问来源于stack exchange,提问作者Takahiko Kawasaki
相关产品推荐
相关产品推荐

