binafy/laravel-user-monitoring
Installation:
composer require binafy/laravel-user-monitoring
php artisan vendor:publish --provider="Binafy\UserMonitoring\UserMonitoringServiceProvider"
php artisan migrate
config/usermonitoring.php) and migrations (creates user_monitoring table).First Use Case:
use Binafy\UserMonitoring\Facades\UserMonitoring;
UserMonitoring::track('user.submitted.form', [
'form_id' => $form->id,
'user_id' => auth()->id(),
'metadata' => ['ip' => request()->ip()]
]);
$events = \Binafy\UserMonitoring\Models\UserMonitoring::latest()->take(10)->get();
Where to Look First:
config/usermonitoring.php (adjust enabled, models, and middleware).app/Http/Kernel.php under $routeMiddleware:
'track.user' => \Binafy\UserMonitoring\Http\Middleware\TrackUser::class,
Then apply to routes:
Route::middleware(['auth', 'track.user'])->group(function () { ... });
\Binafy\UserMonitoring\Models\UserMonitoring if custom fields are needed.Automatic Tracking:
TrackUser middleware to log all authenticated requests:
Route::middleware(['auth', 'track.user'])->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
app/Providers/UserMonitoringServiceProvider.php:
public function boot()
{
UserMonitoring::extend(function ($event) {
$event->ip = request()->ip();
$event->userAgent = request()->userAgent();
});
}
Manual Tracking:
UserMonitoring::track('api.payment.processed', [
'payment_id' => $payment->id,
'amount' => $payment->amount,
'status' => $payment->status
]);
UserMonitoring::track('user.viewed.profile', [], ['tag' => 'profile']);
Querying Events:
// Events for a specific user
$userEvents = UserMonitoring::where('user_id', auth()->id())->get();
// Events with a specific tag
$profileEvents = UserMonitoring::where('tags', 'like', '%"tag":"profile"%')->get();
// Add to UserMonitoring model
public function scopeForAction($query, $action)
{
return $query->where('action', $action);
}
Integration with Notifications:
UserMonitoring::track('auth.failed.login', [
'user_id' => $user->id,
'ip' => request()->ip()
], [], function ($event) {
Notification::route('mail', $event->user->email)
->notify(new FailedLoginAlert($event));
});
Admin Panel:
resources/views/vendor/usermonitoring/...) or extend them.routes/web.php):
Route::middleware(['auth', 'admin'])->get('/monitoring', [MonitoringController::class, 'index']);
Custom Event Models:
class CustomEvent extends \Binafy\UserMonitoring\Models\UserMonitoring
{
protected $casts = [
'metadata' => 'json',
'tags' => 'json',
];
public function scopeForPayment($query)
{
return $query->where('action', 'like', '%payment%');
}
}
'model' => \App\Models\CustomEvent::class,
Batch Processing:
$events = UserMonitoring::query()->limit(1000)->get();
foreach ($events as $event) {
// Analyze or export data
}
Exporting Data:
use Maatwebsite\Excel\Facades\Excel;
Excel::download(new UserMonitoringExport, 'user-monitoring.csv');
class UserMonitoringExport implements FromCollection
{
public function collection()
{
return UserMonitoring::all();
}
public function headings(): array
{
return ['ID', 'Action', 'User ID', 'Created At'];
}
public function map($event): array
{
return [
$event->id,
$event->action,
$event->user_id,
$event->created_at->format('Y-m-d H:i:s'),
];
}
}
Real-Time Monitoring:
UserMonitoring::track('user.online', [], [], function ($event) {
broadcast(new UserActivityBroadcast($event))->toOthers();
});
Performance Overhead:
Route::middleware(['auth', 'track.user'])->group(function () {
// Exclude API routes if not needed
});
UserMonitoring::track('user.action', [], [], function ($event) {
TrackEventJob::dispatch($event);
});
config/usermonitoring.php:
'enabled' => env('APP_ENV') !== 'production', // Disable in prod if needed
Metadata Serialization:
UserMonitoring::track('user.created.post', [
'post' => $post->toArray(), // Convert to array first
]);
protected $casts = [
'metadata' => 'json',
];
Middleware Conflicts:
TrackUser middleware may interfere with other middleware (e.g., auth).app/Http/Kernel.php:
protected $middleware = [
// ...
\Binafy\UserMonitoring\Http\Middleware\TrackUser::class,
];
Route::middleware(['auth'])->group(function () {
Route::middleware(['track.user'])->group(function () {
// Only track these routes
});
});
Database Bloat:
// Run via a scheduled job
UserMonitoring::where('created_at', '<=', now()->subMonths(6))->delete();
User Privacy:
UserMonitoring::extend(function ($event) {
$event->metadata['email'] = strtok(auth()->user()->email, '@');
});
sensitive flag to metadata:
UserMonitoring::track('user.viewed.profile', [
'sensitive_data' => ['email' => auth()->user()->email],
], [], function ($event) {
// Encrypt or hash sensitive fields
});
config/usermonitoring.php:
'log_level' => 'debug', // Options: debug, info, warning, error
How can I help you explore Laravel packages today?