Installation
composer require atldays/laravel-url
Publish the config (if needed):
php artisan vendor:publish --provider="Atldays\LaravelUrl\LaravelUrlServiceProvider" --tag="config"
First Use Case: Basic URL Handling Parse a URL from user input:
use Atldays\LaravelUrl\Url;
$url = Url::fromString('https://example.com/path?query=1');
$url->isValid(); // bool
$url->getScheme(); // "https"
Validation Integration
Add to app/Providers/AppServiceProvider.php:
use Atldays\LaravelUrl\Rules\Url as UrlRule;
protected function boot(): void
{
$this->validateUrls();
}
Use in a form request:
$this->rules = [
'website' => ['required', new UrlRule],
];
Request Macros for Automatic Parsing
Extend Illuminate\Http\Request to auto-convert URL fields:
// In AppServiceProvider@boot()
$this->extendRequestMacros();
Now request()->input('url_field') returns a Url object.
Sanitization Pipelines Clean unsafe URLs (e.g., from user input):
$dirtyUrl = Url::fromString("javascript:alert(1)");
$cleanUrl = $dirtyUrl->sanitize(); // Removes unsafe schemes
Browser-Specific URL Support
Handle non-HTTP(S) schemes (e.g., chrome-extension://):
$extensionUrl = Url::fromString('chrome-extension://abcdef1234');
$extensionUrl->isBrowserScheme(); // true
Laravel Data Integration Auto-cast URLs in DTOs:
use Atldays\LaravelUrl\Casts\Url as UrlCast;
class UserProfile extends \Spatie\LaravelData\Data
{
public function __construct(
public string $website,
) {}
public static function rules(): array
{
return [
'website' => ['nullable', new UrlRule],
];
}
public static function casts(): array
{
return [
'website' => UrlCast::class,
];
}
}
Validation Rules Reusable validation logic:
$this->validate([
'redirect' => ['required', 'url', new UrlRule(['schemes' => ['https']])],
]);
Scheme Whitelisting
Url::fromString('chrome-extension://...')->sanitize(['allow_browser_schemes' => true]);
UTF-8 Validation
Url::fromString('invalid-utf8')->validate(['strict_utf8' => false]);
Request Macro Overrides
$request->hasMacro('parseUrl'); // Check before adding
Laravel Data Conflicts
spatie/laravel-data, ensure the UrlCast is registered after the data provider boots. Use booted events if needed.Performance with Large Inputs
$url = Url::fromString($input)->remember();
Inspect Parsed Components
Use ->toArray() to debug:
$url->toArray(); // ['scheme' => 'https', 'host' => 'example.com', ...]
Validation Errors Check raw validation messages:
$url->validate()->errors(); // Returns a MessageBag
Browser Scheme Quirks
Test edge cases like mailto: or tel: schemes:
$url = Url::fromString('mailto:test@example.com');
$url->isBrowserScheme(); // true
Custom Sanitizers
Add pipeline steps in config/laravel-url.php:
'sanitizers' => [
\Atldays\LaravelUrl\Sanitizers\RemoveUnsafeSchemes::class,
App\Sanitizers\CustomSanitizer::class, // Your class
],
Request Macro Extensions Override default parsing logic:
\Illuminate\Http\Request::macro('parseUrl', function ($key, $default = null) {
$value = $this->input($key, $default);
return Url::fromString($value)->sanitize(['allow_empty' => true]);
});
Validation Rule Customization
Extend UrlRule for project-specific needs:
class ProjectUrlRule extends UrlRule
{
public function __construct(array $options = [])
{
$options['schemes'] = ['https', 'app'];
parent::__construct($options);
}
}
How can I help you explore Laravel packages today?