lvlup-dev/laravel-user-last-seen-at
Installation:
composer require lvlup-dev/laravel-user-last-seen-at
php artisan migrate
The package auto-registers a migration to add last_seen_at to your users table.
First Use Case:
Add the middleware to your web routes in bootstrap/app.php:
$middleware->web(append: [
\LvlupDev\UserLastSeenAt\Http\Middleware\UserLastSeen::class,
]);
Now, every authenticated request will update the last_seen_at timestamp for the user.
Verify: Check a user’s record in the database or via Tinker:
$user = \App\Models\User::first();
echo $user->last_seen_at; // Should reflect the last request time
Middleware Integration:
web, api).$middleware->api(append: [
\LvlupDev\UserLastSeenAt\Http\Middleware\UserLastSeen::class,
]);
Conditional Updates:
php artisan vendor:publish --provider="LvlupDev\UserLastSeenAt\ServiceProvider"
Then configure update_guests in config/user-last-seen-at.php.Manual Updates:
use LvlupDev\UserLastSeenAt\Facades\UserLastSeenAt;
UserLastSeenAt::update(); // Updates for the current user
UserLastSeenAt::update($user); // Updates for a specific user
Query Scopes:
// Users seen in the last 5 minutes
$activeUsers = \App\Models\User::seenIn('5 minutes')->get();
// Users never seen
$inactiveUsers = \App\Models\User::neverSeen()->get();
Customizing the Column:
column_name.last_seen_at field to highlight recently active users in dashboards.scheduler or event listeners:
// Example: Notify admins of inactive users daily
$this->app->booted(function () {
\App\Models\User::whereNull('last_seen_at')
->orWhere('last_seen_at', '<=', now()->subDays(7))
->chunk(100, function ($users) {
// Send notifications
});
});
Middleware Placement:
auth()->user().bootstrap/app.php, place it early in the web group:
$middleware->web(append: [
\App\Http\Middleware\EncryptCookies::class,
\LvlupDev\UserLastSeenAt\Http\Middleware\UserLastSeen::class, // Early!
// ...
]);
Database Transactions:
last_seen_at update runs in a separate query, which may cause transaction conflicts if not handled carefully.DB::transaction() to group updates:
DB::transaction(function () {
// Your logic here
UserLastSeenAt::update(); // Safe within transaction
});
Guest Updates:
update_guests may bloat your database with timestamps for anonymous activity.guest_id column to track sessions.Time Zone Handling:
last_seen_at timestamps use the server’s time zone by default..env (APP_TIMEZONE=UTC) or use Carbon to normalize:
$user->last_seen_at->setTimezone('America/New_York');
Middleware Not Triggering:
storage/logs/laravel.log or enable debug mode (APP_DEBUG=true).Column Missing:
php artisan migrate:fresh if the migration wasn’t applied.Schema::table('users', function (Blueprint $table) {
$table->timestamp('last_seen_at')->nullable()->after('updated_at');
});
Performance:
UserLastSeenAt::queueUpdate(); // Uses Laravel queues
Configure the queue in config/user-last-seen-at.php.Custom Logic:
updatingLastSeen event:
// In a service provider
event(new \LvlupDev\UserLastSeenAt\Events\UpdatingLastSeen($user));
Model Observers:
retrieved events to log activity:
class UserObserver {
public function retrieved(Model $user) {
if (auth()->check() && $user->id === auth()->id()) {
UserLastSeenAt::update();
}
}
}
Testing:
$this->actingAs($user)
->withHeaders(['X-Test-Header' => 'value'])
->get('/dashboard');
$this->assertDatabaseHas('users', [
'id' => $user->id,
'last_seen_at' => now(),
]);
How can I help you explore Laravel packages today?