Laravel event handler for last login

I recently needed to show on the admin side of an app the last login of all users and if they had logged in at all.  I also wanted to show the user the last time that they visited the site.  I used event handlers for both these tasks.

Update the Users Table

I have used the user model to store a timestamp for each event, so I added two new rows to my users table.  I will then be able to access these easily in my blade template.

$table->timestamp('latest_login')->nullable();
$table->timestamp('previous_visit')->nullable();

On the user model I also added both timestamps to the proteced $dates array. By doing this I will be able to use ‘Carbon’ helpers like ‘diffForHumans’.

protected $dates = [
        'created_at',
        'updated_at',
        'latest_login',
        'previous_visit'
    ];

Creating the Event Handlers:

On the admin side I used the login event and for the user I used the logout event to record the current time and date to the users table.

In the EventServiceProvider service provider (app/Providers/EventServiceProvider.php) I added the following to the $listen array:

'Illuminate\Auth\Events\Login' => [
    'App\Listeners\Users\LatestLogin',
],
'Illuminate\Auth\Events\Logout' => [
    'App\Listeners\Users\PreviousLogin',
],

I then ran php artisan event:generate. This command then creates two event listeners located at app\Listeners\Users\LatestLogin and app\Listeners\Users\PreviousLogin.

Each event listener’s handle()method I added the following.  

public function handle(Login $event)
    {
        $event->user->latest_login = Carbon::now();
        $event->user->save();
    }
 public function handle(Logout $event)
    {
        $event->user->previous_visit = Carbon::now();
        $event->user->save();
    }

I also added:

use Carbon\Carbon;

to each listener.

Now when a user logs in or logs out the event listener fires and updates the appropriate row of the users table for the user.

Blade

Finally for completeness in my blade file I can call:

{{ $user->latest_login->diffForHumans() }}

And it will output something like – 1 hour ago – or however long it was since the user signed in.

For the user in the view I add:

Last Visit: {{ Auth::user()->previous_visit->diffForHumans() }}

It outputs something like: Last Visit: 2 days ago

That is about it. I hope this helps someone else out.