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

Laravel Referer Laravel Package

spatie/laravel-referer

Store a visitor’s original referrer in the Laravel session. Detects from utm_source first, then the external domain from the Referer header, otherwise empty. Configurable session key and referrer sources via published config.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require spatie/laravel-referer
    

    Publish the config file (optional):

    php artisan vendor:publish --provider="Spatie\Referer\RefererServiceProvider"
    
  2. First Use Case: Automatically capture the referer on every request. The package stores the referer in the session under the key referer. Access it anywhere in your app:

    $referer = session('referer');
    
    • No middleware or manual setup is required for basic usage.
  3. Where to Look First:

    • Config file for customization (e.g., session key, ignored domains).
    • Service Provider to understand how the package hooks into Laravel’s request lifecycle.

Implementation Patterns

Core Workflows

  1. Automatic Referer Capture: The package listens to the Illuminate\Http\Request events (starting, finished) and populates the session with the referer. No manual intervention is needed for standard use.

  2. Conditional Logic: Use the referer to drive user experience or analytics:

    if ($referer = session('referer')) {
        if (str_contains($referer, 'google.com')) {
            // Show Google-specific CTA
        }
    }
    
  3. Integration with Middleware: Create middleware to act on the referer:

    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class TrackReferer
    {
        public function handle(Request $request, Closure $next)
        {
            $referer = session('referer');
            // Log or process referer data
            return $next($request);
        }
    }
    

    Register in app/Http/Kernel.php:

    protected $middleware = [
        \App\Http\Middleware\TrackReferer::class,
    ];
    
  4. Custom Session Key: Override the default session key (referer) in config/referer.php:

    'session_key' => 'custom_referer_key',
    
  5. Ignoring Specific Domains: Exclude internal or unwanted domains from being captured:

    'ignored_domains' => [
        'example.com',
        'localhost',
    ],
    
  6. Manual Override: Manually set the referer in edge cases:

    session(['referer' => 'custom_referer_url']);
    

Advanced Patterns

  1. Event-Based Processing: Listen to the referer.captured event to react dynamically:

    use Spatie\Referer\Events\RefererCaptured;
    
    RefererCaptured::listen(function (RefererCaptured $event) {
        // Custom logic when referer is captured
    });
    
  2. Referer in API Responses: Include the referer in API responses for client-side tracking:

    return response()->json([
        'data' => $data,
        'referer' => session('referer'),
    ]);
    
  3. Combining with UTM Parameters: Leverage the package’s priority logic (e.g., utm_source over Referer header) for marketing campaigns:

    if (session('referer') === 'newsletter.example.com') {
        // Target newsletter subscribers
    }
    
  4. Testing: Mock the referer in tests:

    $this->withSession(['referer' => 'test_referer']);
    

Gotchas and Tips

Pitfalls

  1. Session Dependency:

    • The referer is stored in the session, so it won’t persist across sessions (e.g., after logout). Clear the session or use a cookie for longer retention if needed.
    • Ensure SESSION_DRIVER in .env is configured (e.g., file, database, redis) to avoid silent failures.
  2. Header Sanitization:

    • The Referer header is sanitized to remove fragments (#) and query strings (?). If you need the raw header, access it directly:
      $rawReferer = $request->header('Referer');
      
  3. HTTPS/HTTP Mismatches:

    • The package normalizes URLs to lowercase and ensures schemes (http://, https://) are consistent. If you need the original scheme, store it separately.
  4. Ignored Domains:

    • Domains in ignored_domains are case-sensitive. Use lowercase for consistency:
      'ignored_domains' => ['EXAMPLE.COM'], // Won't match 'example.com'
      
  5. Caching:

    • The referer is captured per request. If using caching (e.g., Cache::remember), ensure the referer is recaptured if needed:
      $referer = session('referer', fn() => $this->captureReferer());
      
  6. CSRF and Forms:

    • The referer is not tied to CSRF tokens. If you need to validate referers for forms, implement custom logic:
      if ($request->referer !== session('referer')) {
          abort(403, 'Invalid referer');
      }
      

Debugging Tips

  1. Check Session Data: Dump the session to verify the referer is stored:

    dd(session()->all());
    
  2. Log Referer Capture: Add debug logs in the service provider:

    // In RefererServiceProvider.php
    Referer::capture(function ($referer) {
        \Log::debug('Captured referer:', ['referer' => $referer]);
    });
    
  3. Test Edge Cases:

    • No Referer Header: The package defaults to an empty string. Test this scenario:
      $request->headers->remove('Referer');
      $this->assertEmpty(session('referer'));
      
    • Malformed URLs: Ensure the package handles URLs like http:///example.com gracefully (it does, but test locally).
  4. Clear Session Issues: If the referer isn’t persisting, check for:

    • Middleware clearing the session (e.g., StartSession order in Kernel.php).
    • Session drivers with short lifetimes (e.g., array driver).

Extension Points

  1. Custom Referer Logic: Override the Spatie\Referer\Referer class to modify how referers are captured:

    namespace App\Services;
    
    use Spatie\Referer\Referer as BaseReferer;
    
    class CustomReferer extends BaseReferer
    {
        protected function determineReferer(): ?string
        {
            // Custom logic here
            return parent::determineReferer();
        }
    }
    

    Bind it in AppServiceProvider:

    $this->app->bind(\Spatie\Referer\Referer::class, App\Services\CustomReferer::class);
    
  2. Add Referer to Models: Use accessors to attach referer data to Eloquent models:

    public function getRefererAttribute()
    {
        return session('referer');
    }
    
  3. Referer in Views: Share the referer with Blade views:

    View::share('referer', session('referer'));
    

    Access in Blade:

    @if($referer)
        <p>You came from: {{ $referer }}</p>
    @endif
    
  4. Analytics Integration: Pipe referer data to tools like Google Analytics or Mixpanel:

    $referer = session('referer');
    \Analytics::track('referer_visit', ['referer' => $referer]);
    
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.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport