Managing Request Host Information in Laravel

Explanation:

Laravel provides powerful methods for accessing and manipulating request host information, enabling precise control over URL handling and domain-specific logic. These methods - host(), httpHost(), and schemeAndHttpHost() - each serve distinct purposes in URL manipulation and domain handling.

This functionality is particularly crucial when building multi-tenant applications, handling cross-domain requests, or managing applications that need to generate domain-specific URLs dynamically.


Code:

// Basic host information retrieval
$host = $request->host();  // Returns domain name
$httpHost = $request->httpHost();  // Includes port if non-standard
$fullUrl = $request->schemeAndHttpHost();  // Full scheme and host

Here's an example of a multi-environment URL generator:

// app/Services/DomainRouter.php
<?php
 
namespace App\Services;
 
use Illuminate\Http\Request;
 
class DomainRouter
{
    public function __construct(private Request $request)
    {
    }
 
    public function generateRoutes(): array
    {
        $baseHost = $this->request->host();
        $scheme = $this->request->schemeAndHttpHost();
 
        return match($this->getEnvironment($baseHost)) {
            'production' => [
                'api' => "{$scheme}/api/v1",
                'web' => $this->request->httpHost(),
                'assets' => str_replace('api', 'cdn', $scheme),
                'environment' => 'production'
            ],
            'staging' => [
                'api' => "{$scheme}/api/v1",
                'web' => str_replace('api', 'staging', $this->request->httpHost()),
                'assets' => str_replace('api', 'staging-cdn', $scheme),
                'environment' => 'staging'
            ],
            default => [
                'api' => 'http://localhost:8000/api/v1',
                'web' => 'http://localhost:3000',
                'assets' => 'http://localhost:9000',
                'environment' => 'local'
            ]
        ];
    }
 
    private function getEnvironment(string $host): string
    {
        if (str_contains($host, 'prod')) {
            return 'production';
        }
 
        if (str_contains($host, 'staging')) {
            return 'staging';
        }
 
        return 'local';
    }
}

Example usage:

// On production (api.example.com)
{
    "api": "https://api.example.com/api/v1",
    "web": "api.example.com",
    "assets": "https://cdn.example.com",
    "environment": "production"
}
// On staging (api.staging.example.com)
{
    "api": "https://api.staging.example.com/api/v1",
    "web": "staging.example.com",
    "assets": "https://staging-cdn.example.com",
    "environment": "staging"
}

Comments :