goatCounter = $goatCounter; } /** * Handle an incoming request. */ public function handle(Request $request, Closure $next) { $response = $next($request); // Only track "real" HTML page requests: if ( $request->isMethod('GET') && !$request->ajax() && $this->isTrackable($request) ) { $this->goatCounter->trackPageview( '/' . ltrim($request->path(), '/'), $request->route()?->getName() ?? ucfirst(str_replace('/', ' ', $request->path())), $request->headers->get('referer') ); } return $response; } protected function isTrackable(Request $request): bool { $path = $request->path(); // Ignore file extensions (css, js, images, fonts, etc.) if (preg_match('/\.(css|js|png|jpe?g|gif|svg|ico|woff2?|ttf|map)$/i', $path)) { return false; } // Optionally skip API routes if ($request->is('api/*')) { return false; } return true; } }