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.