Mendeteksi User Online dengan Middleware di Laravel

Khairu Aqsara Sudirman

Khairu Aqsara Sudirman

Nov 12, 2020 — 2 mins read
Photo by <a href="https://unsplash.com/@lishakov" target="_blank">Andrej Lišakov</a> on <a href="https://unsplash.com" target="_blank">Unsplash</a>

Photo by Andrej Lišakov on Unsplash

saya sedang mengerjakan sebuah projek kecil-kecilan, dimana semua anggota dalam sebuah tim bisa melihat anggota tim-nya yang sedang online, seperti halnya facebook messanger, saya pikir tidak ada salahnya untuk berbagi tips kecil ini, mungkin saja teman-teman ada yang membutuhkanya.

secara umum, saat proses authentication berhasil, laravel akan menyimpan semua session user yang sedang login, tetapi session tersebut hanya bisa diakses oleh yang berhak saja (yang sedang login) untuk menentukan hak atau akses apa saja yang bisa didapatkan oleh user tersebut.

disini saya akan memanfaatkan Middleware dan menambahkanya dalam route sehingga nantinya setiap user yang berhasil login sessionya akan disimpan (tidak semua data) untuk kebutuhan ini.

pertama kita buat dulu Middleware dengan nama UserOnline dengan perintah php artisan make:midleware UserOnline, kemudian isinya kita modifikasi menjadi seperti berikut

<?php 
namespace App\Http\Middleware;
use Clourse;
use Illuminati\Support\Facades\Cache;

class UserOnline
{
	public function handle($request, Clourse $next)
	{
		//Simpan id user dalam cache 
		Cache::put('user-online:' . auth()->user()->id, now());
		return $next($request);
	}
}

sekarang kita harus meregistrasikan Middleware yang baru saja kita buat agar nantinya bisa kita gunakan dalam route, dengan cara menambahkanya pada file app/Http/Kernel.php dibagian $routeMiddleware

<?php
...
use App\Http\Middleware\UserOnline;
...
protected $routeMiddleware = [
	...
	...
	'user.online'=> UserOnline::class
];

kemudian, langkah selanjutnya kita tinggal menggunakan middleware yang sudah kita buat kedalam file routes/web.php

Route::middleware('auth','user.online')->group(function(){
	...
});

sejauh ini saat user berhasil login, kita sudah bisa mendapatkan id user yang sedang login tersebut melalui Cache::get('user.online:' . auth()->user()->id), tetapi agar lebih informatif lagi, kita akan memodifikasi Model user untuk menambahkan sebuah method yang akan memeriksa apakah user dengan id tertentu masih online atau tidak, untuk itu buka file app/User.php dan tambahkan method berikut.

public function isOnline()
{
	// Check apakah user id user ada dalam cache
	$online = Cache::get('user-online:'. $this->id, null);
	// jika ada, bandingkan waktunya, jika kurang dari 2 menit yang lalu 
    // artinya user masih online
	if(!is_null($online) && $online->diffInMinutes(now()) < 2){
		return true;
	}
	return false;
}

dan tahap terakhir, kita hanya cukup mengimpelentasikan method tersebut kedalam blade template (view) tempat dimana kita akan memberikan informasi user yang sedang online, dalam kasus ini saya hanya menampilkan list sederhana.

<ul>
	@foreach($anggota_tim as $tim)
		<li>
			{{ $tim->nama_lengkap }}
			@if($tim->isOnline())
				<span class="bg-sucsess">Online</span>
			@else
				<span class="bg-danger">Offline</span>
			@endif
		</li>
	@endforeach
</ul>

cukup simple bukan, teman-teman bisa menyesuaikan dengan kebutuhan yang lain jika memang tips kecil ini membantu, jika tidak masih banyak cara yang lain diluar sana yang bisa teman-teman ikuti.

laravel php
Read More

__get() dan __set() Pada Laravel Model

Magic method secara default ada pada semua class yang didifinisikan oleh PHP, hanya saja sebagian tidak terlihat, yang paling umum adalah __construct() atau __desctruct(), saya tidak akan menjelaskan semua tentang magic method pada tulisan ini, karena saya ingin lebih fokus kepada laravel model.