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

Mengganti Alamat Existing GIT Repository

Tentu saja teman-teman sudah terbiasa dengan GIT, biasanya pada setiap repository GIT terdapat dua model URL, yaitu model https dan shh, terkadang kita melakukan cloning menggunakan url https, tidak menggunakan ssh

Read More

Memanfaatkan Query Scope Pada Laravel

Scopes adalah sebuah method yang dapat membuat kita bisa menambahkan database logic tambahan pada model dengan cara yang lebih terstruktur, dengan tujuan membuat penulisan kode pada model dan controller menjadi lebih rapi dan cantik tentunya.