Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Browser Detect Laravel Package

hisorange/browser-detect

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require hisorange/browser-detect
    

    No additional configuration is required—just publish the facade if needed (though not mandatory).

  2. First Usage:

    use Browser;
    
    $browser = Browser::make(request()->userAgent());
    

    Or use the facade directly:

    $browser = Browser::current();
    
  3. Basic Checks:

    if (Browser::is('Chrome')) {
        // Chrome-specific logic
    }
    
    if (Browser::isMobile()) {
        // Mobile-specific logic
    }
    

Where to Look First


Implementation Patterns

Common Workflows

  1. 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);
    }
    
  2. Dynamic UI Adjustments:

    @if(Browser::isMobile())
        <link rel="stylesheet" href="{{ asset('css/mobile.css') }}">
    @endif
    
  3. Feature Flagging:

    if (Browser::is('Chrome') && Browser::version() >= 90) {
        enableExperimentalFeature();
    }
    
  4. User-Agent Parsing in Services:

    public function detectDevice($userAgent) {
        $browser = Browser::make($userAgent);
        return [
            'isMobile' => $browser->isMobile(),
            'browser' => $browser->browser(),
            'version' => $browser->version(),
        ];
    }
    

Integration Tips

  • 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'));
    

Gotchas and Tips

Pitfalls

  1. User-Agent Spoofing:

    • User-Agent strings can be faked. Validate with additional checks (e.g., HTTP headers) if security is critical.
    • Example:
      if (Browser::is('Chrome') && !empty($_SERVER['HTTP_SEC_CHROMIUM'])) {
          // Likely a Chromium-based browser
      }
      
  2. Legacy Browser Support:

    • Older browsers (e.g., IE < 11) may return unexpected results. Test thoroughly.
    • Use Browser::version() to handle version-specific logic:
      if (Browser::is('IE') && Browser::version() < 11) {
          abort(406, 'Unsupported browser');
      }
      
  3. Performance Overhead:

    • Parsing user-agent strings is lightweight, but avoid calling Browser::make() in tight loops or highly frequent routes.
  4. Facade vs. Direct Usage:

    • The facade (Browser::current()) caches the result per request. For multiple checks, use Browser::make() to avoid redundant parsing.

Debugging

  • 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.

Extension Points

  1. 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');
        }
    }
    
  2. 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._]+/',
            ];
        }
    }
    
  3. Laravel Service Provider: Bind your custom parser in AppServiceProvider:

    public function register() {
        $this->app->bind(
            HisOrange\BrowserDetect\UserAgentParser::class,
            CustomParser::class
        );
    }
    

Config Quirks

  • 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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor
spatie/laravel-javascript-views