bilfeldt/laravel-route-statistics
Logs Laravel route usage statistics by recording and aggregating requests/responses per route, user, and timeframe (hour/day/month) to minimize database storage. Helps spot heavy users, high-traffic endpoints, and suspicious unauthenticated activity.
Installation:
composer require bilfeldt/laravel-route-statistics
php artisan vendor:publish --provider="Bilfeldt\LaravelRouteStatistics\LaravelRouteStatisticsServiceProvider" --tag="migrations"
php artisan migrate
Enable Logging:
Add the middleware globally in bootstrap/app.php:
$middleware->prepend(\Bilfeldt\LaravelRouteStatistics\Http\Middleware\RouteStatisticsMiddleware::class);
First Use Case: Immediately start analyzing route usage via Artisan:
php artisan route:stats
Selective Logging:
Route::middleware(['routestatistics'])->group(function () {
Route::get('/admin', 'AdminController@index');
});
$request->routeStatistics(); // Enable for specific requests
Contextual Data: Attach metadata (e.g., team IDs) via middleware:
public function handle($request, Closure $next) {
$request->routeStatisticsContext(['team_id' => auth()->user()->team_id]);
return $next($request);
}
Aggregation:
Configure aggregation in config/routestatistics.php:
'aggregation' => [
'enabled' => true,
'period' => 'hour', // 'minute', 'hour', 'day', 'month'
],
Querying Data: Use model scopes for filtered stats:
RouteStatistics::whereApi()->where('route', 'api.posts.store')->get();
'queue' => [
'enabled' => true,
'connection' => 'database',
],
RouteStatistics for domain-specific needs:
class CustomRouteStatistic extends RouteStatistics {
public function user() {
return $this->belongsTo(User::class, 'user_id');
}
}
Performance:
php artisan route:unused to purge stale routes.Aggregation Quirks:
date field is castable to Carbon (default in v4+).Middleware Order:
Place RouteStatisticsMiddleware before auth middleware to capture unauthenticated requests.
php artisan route:list --middleware=routestatistics
routeStatisticsContext() is called before the request completes.RouteStatistics model and update the factory:
class RouteStatistics extends Model {
protected $casts = [
'custom_field' => 'array',
];
}
aggregate() method in the model for custom rules.RouteStatisticsCommand for domain-specific stats:
class CustomStatsCommand extends RouteStatisticsCommand {
protected function getRoutes() {
return Route::getRoutes()->getByName('admin.*');
}
}
How can I help you explore Laravel packages today?