jenssegers/agent
User agent detection for PHP and Laravel based on Mobile Detect, with added desktop support. Quickly identify device type (mobile/tablet/desktop), platform, browser, and specific features via is() checks, magic isX methods, regex matching, and custom UA/header parsing.
Install via Composer: composer require jenssegers/agent. In modern Laravel (>=5.5), it auto-registers — no manual service provider or facade configuration needed. Start using it immediately in controllers, middleware, or services:
use Jenssegers\Agent\Agent;
$agent = new Agent();
// Or in Laravel: Agent::isMobile(), Agent::device(), etc.
First common use case: conditionally render views or redirect in a controller based on Agent::isMobile() or Agent::isDesktop() (e.g., serve mobile-optimized layout for phones/tablets).
DetectDevice) that detects device type, sets shared view variables (view()->share('isMobile', Agent::isMobile())), and makes context available across all views.Agent::isRobot() in routes to serve sitemap.xml to crawlers, or Agent::isPhone() to route to lightweight endpoints (e.g., /mobile/profile).Agent into services (e.g., AnalyticsService, ContentNegotiator) to enable unit testing and avoid static coupling.setUserAgent($ua) and setHttpHeaders($headers) to detect outdated devices or unknown bots.@if(Agent::isMobile()) or @if(Agent::isTablet()) for minor UI tweaks (e.g., simplified navigation, larger touch targets).match() fallbacks (e.g., Agent::match('/.+(Mobile|Touch)/i') for ambiguous cases).version() is unreliable: The Agent::version($browser) method is explicitly labeled beta; prefer platform/browser names over versions (e.g., avoid browser-specific CSS/JS patches based on version).new Agent() for per-request isolation or avoid calling setUserAgent() globally.isAndroidOS() and isSafari() are case-sensitive; use IDE autocompletion or reference the original MobileDetect list to avoid silent failures.isRobot() uses jaybizzle/crawler-detect, headless browsers (e.g., Puppeteer, Playwright) or SPA crawlers (e.g., Googlebot’s Chromium-based) may not trigger detection. Layer in match('/(?:Chrome|Headless)\/\d+/i') for stricter control.session()->put('device', Agent::isMobile() ? 'mobile' : 'desktop')) to prevent re-parsing.How can I help you explore Laravel packages today?