In this tutorial, we are going to learn how to get online users in our Laravel application. In here we are going to make our custom middleware.
 Prerequisites
 
     Laravel 
    To Continue with this tutorial, you should have installed Laravel 8 in your pc. If you are still not installed Laravel in your machine you can configure it from here. 
Setting up the Project 
First you need to create a new laravel project by running below command in your terminal1 composer create-project laravel/laravel laravel-get-online-user 
 Then navigate to your project directory by using below command in your terminal
1 cd laravel-get-online-user 
Set up Database details 
Now you need to configure your Database details in your .env file.
1 2 3 4 5 6 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel_online_user DB_USERNAME=root DB_PASSWORD= 
 
Add new column to Users table 
We need to add last_seen column to default user migration file in our Laravel application.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration {     public function up()     {         Schema::create('users', function (Blueprint $table) {             $table->id();             $table->string('name');             $table->string('email')->unique();             $table->timestamp('last_seen')->nullable();             $table->timestamp('email_verified_at')->nullable();             $table->string('password');             $table->rememberToken();             $table->timestamps();         });     }     public function down()     {         Schema::dropIfExists('users');     } } 
 Also don’t forget to last_seen table value in app/Models/User.php file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?php namespace App; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable {     use Notifiable;     protected $fillable = [         'name', 'email', 'password', 'last_seen'     ];     protected $hidden = [         'password', 'remember_token',     ];     protected $casts = [         'email_verified_at' => 'datetime',     ]; } 
Generate Auth Scaffolding 
In here we use dafault auth scaffolding in Laravel. To install it run below command in your terminal:
1 composer require laravel/ui --dev 
1 php artisan ui bootstrap --auth 
 To compile assets, run below command in your termianl:
Create Middleware 
Now we need to create UserActivity middleware for update last seen time and add online status, to create middlware let's run bellow command:
1 php artisan make:middleware UserActivity 
 After that place below code in UserActivity middleware:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?php    namespace App\Http\Middleware;    use Closure; use Illuminate\Http\Request; use Auth; use Cache; use App\Models\User;    class UserActivity {     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);     } } 
Then we need to register our newly created middleware in our kernal.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <?php    namespace App\Http;    use Illuminate\Foundation\Http\Kernel as HttpKernel;    class Kernel extends HttpKernel {     ...........     protected $middlewareGroups = [         'web' => [             \App\Http\Middleware\EncryptCookies::class,             \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,             \Illuminate\Session\Middleware\StartSession::class,             \Illuminate\View\Middleware\ShareErrorsFromSession::class,             \App\Http\Middleware\VerifyCsrfToken::class,             \Illuminate\Routing\Middleware\SubstituteBindings::class,             \App\Http\Middleware\RestrictIpAddressMiddleware::class,             \App\Http\Middleware\UserActivity::class,         ],            'api' => [             'throttle:api',             \Illuminate\Routing\Middleware\SubstituteBindings::class,         ],     ];     ........... } 
Create Controller 
Now we need to create UserController and add following code on that file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <?php    namespace App\Http\Controllers;    use Illuminate\Http\Request; use App\Models\User;    class UserController extends Controller {     public function index(Request $request)     {         $users = User::select("*")             ->whereNotNull('last_seen')             ->orderBy('last_seen', 'DESC')             ->paginate(10);                    return view('users', compact('users'));     } } 
 
Create View 
we need to create blade file called `/users.blade.php` in `resources/views` directory and paste this code in it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 @extends('layouts.app')    @section('content') <div class="container">     <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 
 
Create Route 
Change your web.php file according to this:
1 2 3 4 5 6 7 8 9 10 11 <?php    use Illuminate\Support\Facades\Route;    use App\Http\Controllers\UserController;    Auth::routes(); Route::get('/', [UserController::class, 'index']); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); 
 
Run the application 
To run your application run below command in your termial:
 Then navigate to following URL:
Conclusion 
In this tutorial, we learned how to get online users in Laravel. If you have any issue regarding this tutorial, mention your issue in comment section or reach me through my E-mail. You can obtainf the complete source code  from this GitHub repository .