سلام دوستان عزیز
اگه راهی برای نمایش کاربران آنلاین وبسایت رو میدونید یا منبعی برای این کار میشناسید معرفی کنید.
ابتدا یک Middleware با نام دلخواه ایجاد میکنیم
به فرض مثال اسمش UserActivity قرار میدیم
بعد وارد اون Middleware میشیم و کد زیر رو بهش اضافه میکنیم
public function handle($request, Closure $next)
{
if (Auth::check())
{
$expiresAt = Carbon::now()->addMinutes(1);
Cache::put('user-is-online-' . Auth::user()->id, true,$expiresAt);
}
return $next($request);
}
بعدش باید این فایل به قسمت $middlewareGroups درون فایل Kernel.php اضافه کنیم
به شکل زیر:
protected $middlewareGroups = \[
'web' => \[
\\App\\Http\\Middleware\\EncryptCookies::class,
\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse::class,
\\Illuminate\\Session\\Middleware\\StartSession::class,
// \\Illuminate\\Session\\Middleware\\AuthenticateSession::class,
\\Illuminate\\View\\Middleware\\ShareErrorsFromSession::class,
\\App\\Http\\Middleware\\VerifyCsrfToken::class,
\\Illuminate\\Routing\\Middleware\\SubstituteBindings::class,
\\App\\Http\\Middleware\\UserActivity::class,
\],
بعد وارد مدل user میشیم و کد زیر بهش اضافه میکنیم
public function isOnline(){
return Cache::has('user-is-online-' . $this->id);
}
بعد از این مراحل وارد کنترلر مورد نظر خودمون میشیم و اطلاعات user به ویو مورد نظر خودمون ارسال میکنیم
حالا کافیه در ویو با شرط if به شکل زیر کاربری که آنلاین هست نمایش بدیم
@foreach($users as $user)
@if($user->isOnline())
<button class="btn-success btn" style="cursor: default; " > Online </button>
@else
<button class="btn-dark btn" style="cursor:default;"> Offline </button>
@endif
@endforeach
بازم هم سوالی بود در خدمتم
سلام ممنون بابت پستتون مفید بود
روی همه کاربرا حلقه گذاشتین؟؟
اگه جواب بله هست > مشکلی پیش نمیاد ؟
سلام
من تمام مراحلی که گفتین رو انجام دادم ورو همه ی کاربرا حلقه زدم تا آنلاین و آفلاین بودنشون رو نشون بده اما وقتی با یه کاربر لاگین میشم و صفحه نمایش وضعیت آنلاین بودن کاربرا رو لود میکنم همه ی کاربرا رو آنلاین نشون میده باید چکار کنم؟
سلام
شما میتونین از پکیج زیر استفاده کنین
https://github.com/shetabit/visitor
کاربران انلاین
User::online()->get();
اگر چه روش اشاره شده هم به نوعی کار راه انداز هست ولی به نظرم روش اصولی تر و حرفه ای ترش استفاده از websocket هاست. در حالت قبلی شما بعد از لود شدن صفحه اگر کاربر آفلاین بشه یا افراد جدیدی آنلاین بشن ازشون بی خبر هستی. ولی با استفاده از web socket ها بصورت real-time هر اتفاقی که بیفته (آنلاین شدن افراد جدید یا آفلاین شدن افراد قدیم) در سمت فرانت اند بدون reload متوجهش خواهی شد.
در لاراول هم که استفاده از ابزار pusher این کارو بشدت راحت و سریع میکنه.
مطالعه بیشتر:
https://devmarketer.io/learn/websockets-laravel-part-0-websockets/
سلام.. فکر میکنم سوالم کمی به سوال (یا مطلب) این دوستمون شبیه باشه..
من در یکی از اولین پروژه هام (تمرینی) برای اینکه بگم کاربر "چقدر قبل" آنلاین بوده، اول در مدل یوزر یک تابع تعریف کردم که با هربار فراخوانی، زمان now رو به دیتابیس رکورد میکنه. بعد در بلید master (که در همه پیجها include شده و همه جا هست) اون تابع رو برای کاربر لاگین شده فراخوانی کردم! اینطوری با لود هر صفحه اون تابع فراخوانی و اجرا میشه و هر جا هم همون رکورد (مربوط به هر یوزر) رو از دیتابیس فراخوانی کنید (مثلا در پروفایل کاربر) طبعاً آخرین زمان لود یک پیج توسط کاربر رو نشون میده. (از پکیج Verta برای تبدیلات تایم و تاریخ و .. استفاده کردم) .
خیلی روش داغونی استفاده کردم عایا؟ :/
مجددا با اینکه با این مدل روش ها ممکن هست که کار راه بیافته ولی قطعا روش اصولی و قابل پیشنهادی نیست. چون اقدامات زیادی باید با هر بار ریکوئست رفتن سمت سرور انجام بشه که زائد هستند و جمع همه این ها در کنار هم ضربدر تعداد مراجعات بالای مخاطبان میشه سربار سرور که میتونه حائز اهمیت باشه.
ضمن اینکه ایراد روش قبلی باز هم به این روش وارد هست و اون هم اینکه بعد از لود صفحه هیچ گونه اطلاعات جدیدی دریافت نمیکنید. مگر اینکه مجددا صفحه رو رفرش کنید. ولی با وب سوکت ها یک ارتباط پایدار ایجاد میشه که باعث میشه هر اتفاقی می افته بصورت real-time در سمت فرانت اند هم ازش مطلع بشیم.
اگر زبانتون خوبه این یکی از بهترین آموزشهاست.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟