Installation:
composer require hisorange/browser-detect
No additional configuration is required—just publish the facade if needed (though not mandatory).
First Usage:
use Browser;
$browser = Browser::make(request()->userAgent());
Or use the facade directly:
$browser = Browser::current();
Basic Checks:
if (Browser::is('Chrome')) {
// Chrome-specific logic
}
if (Browser::isMobile()) {
// Mobile-specific logic
}
Browser for quick checks.Browser::isMobile(), Browser::isTablet().Browser::is('Firefox').Middleware for Browser-Specific Redirects:
public function handle($request, Closure $next) {
if (Browser::is('Safari') && Browser::version() < 14) {
return redirect()->route('safari-upgrade');
}
return $next($request);
}
Dynamic UI Adjustments:
@if(Browser::isMobile())
<link rel="stylesheet" href="{{ asset('css/mobile.css') }}">
@endif
Feature Flagging:
if (Browser::is('Chrome') && Browser::version() >= 90) {
enableExperimentalFeature();
}
User-Agent Parsing in Services:
public function detectDevice($userAgent) {
$browser = Browser::make($userAgent);
return [
'isMobile' => $browser->isMobile(),
'browser' => $browser->browser(),
'version' => $browser->version(),
];
}
Laravel Request Wrapper:
Extend the Request class to auto-detect browser:
namespace App\Http\Request;
use Browser;
use Illuminate\Http\Request as BaseRequest;
class Request extends BaseRequest {
public function browser() {
return Browser::make($this->userAgent());
}
}
Then use request()->browser() anywhere.
Caching Results: Cache browser detection for performance-critical routes:
$browser = Cache::remember('browser_' . $request->ip(), 3600, function () use ($request) {
return Browser::make($request->userAgent());
});
Testing:
Use Browser::fake() in tests to simulate different browsers:
Browser::fake('Chrome');
$this->assertTrue(Browser::is('Chrome'));
User-Agent Spoofing:
if (Browser::is('Chrome') && !empty($_SERVER['HTTP_SEC_CHROMIUM'])) {
// Likely a Chromium-based browser
}
Legacy Browser Support:
Browser::version() to handle version-specific logic:
if (Browser::is('IE') && Browser::version() < 11) {
abort(406, 'Unsupported browser');
}
Performance Overhead:
Browser::make() in tight loops or highly frequent routes.Facade vs. Direct Usage:
Browser::current()) caches the result per request. For multiple checks, use Browser::make() to avoid redundant parsing.Inspect Raw Data:
$browser = Browser::make($userAgent);
dd($browser->toArray()); // Full parsed data
Useful for debugging edge cases.
Update Dependencies:
If detection fails for a new browser/device, ensure the underlying packages (e.g., mobiledetectlib) are up-to-date.
Custom Detection Logic:
Override the default detection by extending the Browser class:
use HisOrange\BrowserDetect\Browser as BaseBrowser;
class CustomBrowser extends BaseBrowser {
public function isCustomBot() {
return $this->isBot() && str_contains($this->userAgent, 'CustomBot');
}
}
Add Custom User-Agent Patterns:
Extend the UserAgentParser class to handle niche cases:
use HisOrange\BrowserDetect\UserAgentParser;
class CustomParser extends UserAgentParser {
protected function getCustomPatterns() {
return [
'CustomBot' => '/CustomBot\/[0-9._]+/',
];
}
}
Laravel Service Provider:
Bind your custom parser in AppServiceProvider:
public function register() {
$this->app->bind(
HisOrange\BrowserDetect\UserAgentParser::class,
CustomParser::class
);
}
No Config File: The package is zero-config, but you can publish the config (though it’s unused by default):
php artisan vendor:publish --provider="HisOrange\BrowserDetect\BrowserDetectServiceProvider"
Useful if you need to override default parser classes.
Locale Support:
The package supports multiple locales (e.g., Browser::locale('fr')), but ensure your app’s locale is set correctly if using dynamic detection.
How can I help you explore Laravel packages today?