A comprehensive Laravel package for tracking user activities and history with advanced features like automatic event recording, detailed analytics, and flexible configuration.
- 🔍 Automatic Activity Tracking - Automatically record model events (created, updated, deleted, restored)
- 👤 User Activity Monitoring - Track user actions with IP address and user agent
- 📊 Advanced Analytics - Built-in statistics, charts, and reporting
- 🎯 Flexible Filtering - Filter activities by user, action, date range, and more
- 📱 API Support - RESTful API endpoints for integration
- 🎨 Dashboard Widget - Ready-to-use dashboard components
- 📤 Export Functionality - Export activities to CSV and JSON formats
- đź”” Notification System - Configurable notifications for specific events
- đź§ą Auto Cleanup - Automatic cleanup of old activity records
- 🛡️ Security Features - IP tracking, user agent logging, and data retention policies
- PHP 8.1 or higher
- Laravel 10.x, 11.x, or 12.x
- spatie/laravel-permission 5.x or 6.x
- Install the package via Composer:
composer require laravelplus/user-history
- Publish the configuration file:
php artisan vendor:publish --provider="LaravelPlus\UserHistory\Providers\UserHistoryServiceProvider"
- Run the migrations:
php artisan migrate
The package configuration is located in config/user-history.php
. Here are the key configuration options:
# Enable/disable automatic event recording
USER_HISTORY_AUTO_RECORD=true
# Track IP address
USER_HISTORY_TRACK_IP=true
# Track user agent
USER_HISTORY_TRACK_USER_AGENT=true
# Track model properties/changes
USER_HISTORY_TRACK_PROPERTIES=true
# Activity retention in days (null to disable cleanup)
USER_HISTORY_RETENTION_DAYS=365
# Items per page
USER_HISTORY_PER_PAGE=15
# Dashboard widget settings
USER_HISTORY_DASHBOARD_ENABLED=true
USER_HISTORY_DASHBOARD_LIMIT=10
# Route settings
USER_HISTORY_ROUTES_ENABLED=true
USER_HISTORY_ROUTES_PREFIX=admin/user-history
# API settings
USER_HISTORY_API_ENABLED=true
USER_HISTORY_API_PREFIX=api/user-history
# Notifications
USER_HISTORY_NOTIFICATIONS_ENABLED=false
# Export settings
USER_HISTORY_EXPORT_ENABLED=true
USER_HISTORY_EXPORT_MAX_RECORDS=10000
- Add the trait to your models:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use LaravelPlus\UserHistory\Traits\HasUserActivity;
class Post extends Model
{
use HasUserActivity;
// Your model code...
}
- The trait automatically records activities for:
- Model creation (
created
event) - Model updates (
updated
event) - Model deletion (
deleted
event) - Model restoration (
restored
event) - if using SoftDeletes
- Model creation (
// Record a custom activity
$post->recordActivity('published', 'Post was published');
// Record with additional properties
$post->recordActivity('status_changed', 'Post status updated', [
'old_status' => 'draft',
'new_status' => 'published'
]);
// Record with metadata
$post->recordActivity('viewed', 'Post was viewed', [], [
'session_id' => session()->getId(),
'referrer' => request()->header('referer')
]);
use LaravelPlus\UserHistory\Services\UserActivityService;
$service = new UserActivityService();
// Get activities with filters
$activities = $service->getActivities([
'user_id' => 1,
'action' => 'created',
'date_from' => now()->subDays(7),
'date_to' => now()
]);
// Get paginated activities
$paginatedActivities = $service->getPaginatedActivities([
'user_id' => 1
], 20);
// Get activity statistics
$stats = $service->getActivityStats([
'date_from' => now()->subMonth()
]);
// Export activities
$csvFile = $service->exportToCsv([
'user_id' => 1,
'action' => 'created'
]);
// Get all activities for a model
$post->activities;
// Get activities for a specific user
$user->activities;
// Get recent activities
$recentActivities = UserActivity::with(['user', 'subject'])
->orderBy('created_at', 'desc')
->limit(10)
->get();
The package provides several routes for managing user activities:
GET /admin/user-history
- DashboardGET /admin/user-history/activities
- Activity listingGET /admin/user-history/stats
- StatisticsGET /admin/user-history/users
- User listingGET /admin/user-history/users/{user}
- User profileGET /admin/user-history/reports/export
- Export reports
GET /api/user-history/activities
- Get activitiesGET /api/user-history/stats
- Get statisticsGET /api/user-history/chart-data
- Get chart dataGET /api/user-history/search
- Search activities
The package creates a user_activities
table with the following structure:
CREATE TABLE user_activities (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT UNSIGNED NULL,
action VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
ip_address VARCHAR(45) NULL,
user_agent TEXT NULL,
subject_type VARCHAR(255) NULL,
subject_id BIGINT UNSIGNED NULL,
properties JSON NULL,
metadata JSON NULL,
created_at TIMESTAMP NULL,
updated_at TIMESTAMP NULL,
deleted_at TIMESTAMP NULL,
INDEX idx_user_created (user_id, created_at),
INDEX idx_action_created (action, created_at),
INDEX idx_subject (subject_type, subject_id),
INDEX idx_created (created_at),
INDEX idx_ip (ip_address),
INDEX idx_subject_created (subject_type, subject_id, created_at)
);
Override the getActivitySubjectName()
method in your models:
public function getActivitySubjectName(): string
{
return $this->title ?? $this->name ?? 'Post #' . $this->id;
}
public function getActivitySubjectUrl(): ?string
{
return route('posts.show', $this);
}
Add to your configuration:
// Exclude specific models
'excluded_models' => [
\App\Models\Log::class,
\App\Models\Cache::class,
],
// Exclude specific fields from tracking
'ignored_fields' => [
'updated_at',
'created_at',
'deleted_at',
'remember_token',
'password',
],
// Override the default description
protected function getDefaultActivityDescription(string $action): string
{
return match ($action) {
'created' => "New post '{$this->title}' was created",
'updated' => "Post '{$this->title}' was updated",
'deleted' => "Post '{$this->title}' was deleted",
default => parent::getDefaultActivityDescription($action),
};
}
The package provides several Artisan commands:
# Clean old activities
php artisan user-history:cleanup
# Export activities
php artisan user-history:export
# Generate activity report
php artisan user-history:report
The package dispatches events that you can listen to:
// In your EventServiceProvider
protected $listen = [
'LaravelPlus\UserHistory\Events\ActivityRecorded' => [
'App\Listeners\LogActivityToExternalService',
],
];
# Run the package tests
composer test
# Run with coverage
composer test -- --coverage
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests
- Submit a pull request
This package is open-sourced software licensed under the MIT license.
For support, please open an issue on GitHub or contact the LaravelPlus team at [email protected].
- Initial release
- Automatic activity tracking
- Dashboard and analytics
- API endpoints
- Export functionality
- Notification system