یه migration به اسم دلخواه بساز
php artisan make:migration add_new_column_last_seen
یه فیلد به اسم دلخواه مثلا lastseen در جدول user ها اضافه کن
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddNewColumnLastSeen extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function(Blueprint $table){
$table->timestamp('last_seen')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
}
یه middleware بساز که برای همه route ها بتونی اعمالش کنی
php artisan make:middleware UserActivity
این دستور رو داخل متد handle بزار
این کد یه کش با مدت زمان دو دقیقه با id اون کاربر می سازه و می تونی چک کنی که تا دوقیقه پیش کی آنلاین بوده وکی آنلاین نیست
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Auth;
use Cache;
use App\Models\User;
class UserActivity
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
$expiresAt = now()->addMinutes(2); /* keep online for 2 min */
Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
/* last seen */
User::where('id', Auth::user()->id)->update(['last_seen' => now()]);
}
return $next($request);
}
}
حالا مثلا توی پنل ادمینت توی یه لیستی میخوای نشون بدی کی آنلاینه و کی آفلاینه
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Laravel Display Online Users - ItSolutionStuff.com</h1>
<table class="table table-bordered data-table">
<thead>
<tr>
<th>No</th>
<th>Name</th>
<th>Email</th>
<th>Last Seen</th>
<th>Status</th>
</tr>
</thead>
<tbody>
@foreach($users as $user)
<tr>
<td>{{ $user->id }}</td>
<td>{{ $user->name }}</td>
<td>{{ $user->email }}</td>
<td>
{{ Carbon\Carbon::parse($user->last_seen)->diffForHumans() }}
</td>
<td>
@if(Cache::has('user-is-online-' . $user->id))
<span class="text-success">Online</span>
@else
<span class="text-secondary">Offline</span>
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
ببین اگه بتونی از لایو وایر استفاده کنی خیلی خوبه توی دوره لایو وایر اتفاقا پروژه آخرش مرتبطه
@hamidShahbazi
درود...
این قابلیت توی پروژه ام استفاده کردم ولی خوب عمل نمی کنه...
موقعی که ورود می کنم نمی زنه آنلاین...
همش آفلاینه...
تب network قسمت WS سایت roocket رو نگاه کنین متوجه میشین داره از websocket استفاده میکنه
احتمالا یه سرور nodejs اون پشت هست که کاربر های آنلاین رو ذخیره میکنه و موقع آفلاین شدن هم حذفشون میکنه
@endworld
درود..
در کل این روش داره زمانی که یه کاربر لاگین میکنه ، یک کش میسازه (با اسم ثابت و در آخرش user->id) که مقدارش true و زمان اعتبارش دو دقیقه هست (که میتونید اصلا زمان براش تعریف نکنید و forever باشه و زمانی که logout کرد کش حذف بشه)
Cache::put('user-is-online-' . $user->id, true, now()->addMinutes(2))
حالا شما زمانی که میخوایید بفهمید که کاربر آنلاین هست یا نه؟؟ باید چک کنی که این کش با آیدی یوز مورد نظر وجود داره یانه که اگر کش وجود داشت ،کاربر آنلاینه و اگر وجود نداشت ، کاربر آنلاین نیست.
حالا اینکه کار نمیکنه ببیند اصلا کش ساخته میشه ؟؟ مثلا توی همون middleware یه dd بگیرید ببینید اصلا موقع لاگین middleware کار میکنه؟؟ شاید middleware رو توی kernel اضافه نکردید یا همچین اشتباهاتی...
بابا من خیلی نوب تازه واردم
اما نمیشه است روش که یه فیلد تو جدول user قرار داد و موقع لاگین کرد با سشن بگیم اون فیلد جدول true کنه و هر مدقع سشن هم رفت بره اون فیلد جدول false کنه
این نمیشه ؟ چرا اینو نگفتید ؟
@hamidShahbazi @endworld
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟