league/uri
League URI provides simple, intuitive PHP 8.1+ classes to parse, validate, normalize, and manipulate URIs and related components. Supports PSR-7 interoperability, IDN hosts (intl/polyfill), IPv4 conversion, and HTML URI handling.
Illuminate\Support\Uri with a more feature-rich, RFC-compliant alternative, particularly for:
normalize(), toAsciiString()).isSameOrigin(), isCrossOrigin()).isIpv4Host(), getUnicodeHost()).UriTemplate for dynamic route generation).Http class implements Psr\Http\Message\UriInterface), enabling consistency with PSR-17 (UriFactoryInterface) and PSR-15 (HttpServerRequestInterface).withPath(), withQuery()) return new instances, avoiding side effects—a critical requirement for Laravel’s request/response lifecycle.Illuminate\Routing\UrlGenerator’s URI logic with League\Uri\Uri for RFC-compliant path/host resolution (e.g., handling ~ in user paths, IPv6 literals).isSameOrigin(), isLocalFile(), and isCrossOrigin() in CORS middleware or authentication guards.UriTemplate for dynamic API endpoint generation (e.g., /users/{id} → /users/123).psr/http-message).symfony/psr-http-message-bridge for PSR-7 interop in Laravel 10+.intl, dom) are optional but recommended for full functionality.| Risk Area | Severity | Mitigation |
|---|---|---|
| Breaking Changes | Medium | Laravel’s Uri class is not deprecated; migration would require feature flags or a wrapper facade. |
| Performance Overhead | Low | Benchmarks show <5% overhead vs. native PHP URI parsing (per League’s PHPBench). |
| Extension Dependencies | Medium | intl/dom are optional; polyfills (e.g., symfony/polyfill-intl-idn) can mitigate. |
| PSR-7 Complexity | Low | Laravel’s Psr7 facade abstracts PSR-7 intricacies; League\Uri\Http bridges seamlessly. |
| Deprecation Warnings | Low | PHP 8.4’s Deprecated attribute is used sparingly; no immediate impact. |
Illuminate\Support\Uri in favor of League\Uri\Uri (backward-compatible wrapper)?Url::to() or Url::route() methods?League\Uri handles?mailto: or blob:) be added to Laravel’s validation rules?Request objects) offset the parsing overhead?Uri::toRfc8089() for file URIs)?UriTemplate be exposed in Laravel’s route model binding system?Illuminate\Routing\Router::getUriFor() with League\Uri\Uri::resolve() for RFC-compliant path resolution.isSameOrigin() in Illuminate\Auth\Middleware\Authenticate or Illuminate\Http\Middleware\VerifyCsrfToken.UriTemplate with Illuminate\Routing\Route for dynamic route generation (e.g., /api/v1/{version}/users).Uri::fromFileContents() in Illuminate\Filesystem\Filesystem for local file URI handling.League\Uri\Http implements Psr\Http\Message\UriInterface; use HttpFactory for PSR-17 compliance.Illuminate\Http\Request via Psr7 facade (e.g., Request::getUri() → League\Uri\Http).Guzzle\Uri\Uri with League\Uri\Http for consistent URI handling.symfony/psr-http-message (use League\Uri as the single source of truth).| Phase | Action | Tools/Dependencies |
|---|---|---|
| 1. Evaluation | Benchmark League\Uri vs. Laravel’s Uri in critical paths (routing, validation). |
PHPBench, Laravel Debugbar. |
| 2. Wrapper | Create a compatibility facade (Illuminate\Support\Facades\Uri) that delegates to League\Uri\Uri. |
Laravel’s Facade pattern. |
| 3. Core Integration | Replace Illuminate\Support\Uri with League\Uri\Uri in: |
composer require league/uri |
- Illuminate\Routing\UrlGenerator |
||
- Illuminate\Validation\Validator |
||
- Illuminate\Http\Request |
||
| 4. Feature Expansion | Add UriTemplate support to Route::bind() and Route::parameter(). |
Custom Laravel service provider. |
| 5. Deprecation | Deprecate Illuminate\Support\Uri in Laravel 11.x, remove in 12.x. |
@deprecated annotations, deprecation helpers. |
intl (for IDN), dom (for HTML-related URIs).GMP/BCMath (for IPv4 conversion; fallback to 64-bit PHP).slug, redirect_url) can leverage League\Uri for validation.League\Uri as a dev dependency and test in isolation.Validator) first.UrlGenerator) and request handling.UriTemplate support to API resources.Illuminate\Support\Uri and migrate core HTTP logic (e.g., Request, Response).League\Uri handles edge cases (e.g., ~ in paths, IPv6) natively.withQuery() vs. setQuery()).isCrossOrigin()How can I help you explore Laravel packages today?