News

PHP 8.5 Introduces a New URI Extension

Published Updated
PHP 8.5 Introduces a New URI Extension image

PHP 8.5 introduces a new URI extension, which is a standards-compliant parser "for both RFC 3986 and the WHATWG URL standard as an always-available part of its standard library within a new 'URI' extension." The RFC has plenty of examples, but here's one from the PHP foundation announcement post showcasing the RFC 3986 Uri class:

use Uri\Rfc3986\Uri;
 
$url = new Uri('HTTPS://thephp.foundation:443/sp%6Fnsor/');
 
$defaultPortForScheme = match ($url->getScheme()) {
'http' => 80,
'https' => 443,
'ssh' => 22,
default => null,
};
 
// Remove default ports from URLs.
if ($url->getPort() === $defaultPortForScheme) {
$url = $url->withPort(null);
}
 
// Getters normalize the URL by default. The `Raw`
// variants return the input unchanged.
 
echo $url->toString(), PHP_EOL;
// Prints: https://thephp.foundation/sponsor/
echo $url->toRawString(), PHP_EOL;
// Prints: HTTPS://thephp.foundation/sp%6Fnsor/

When a parsing error occurs, constructing a new instance will throw a UrlValidationError exception, and using the static parse() method will return errors in a referenced variable:

$url = new Uri\WhatWg\Url("invalid url");
// Throws Uri\WhatWg\InvalidUrlException
 
$errors = [];
$url = Uri\WhatWg\Url::parse("invalid url", null, $errors);
// null is returned, and an array of UrlValidationError
// objects are passed by reference to $errors
 
/*
array(1) {
[0]=>
object(Uri\WhatWg\UrlValidationError)#1 (2) {
["context"]=>
string(11) "invalid uri"
["type"]=>
enum(Uri\WhatWg\UrlValidationErrorType::MissingSchemeNonRelativeUrl)
["failure"]=>
bool(true)
}
}
*/

URIs in Laravel

While it's notable that PHP 8.5 introduces an RFC-compliant URI component, it will take some time for the broader PHP community to leverage it fully. For example, until frameworks like Laravel define PHP 8.5 as the minimum version required, the framework cannot use any PHP 8.5 features. Of course, you can use PHP 8.5 features in your application even if frameworks lag a version or two behind the latest.

In the meantime, Laravel's URI class introduced in Laravel 11.35 uses the league/uri package under the hood, which implements RFC 3986. Laravel's URI class is powerful, and will work across Laravel >=11.35 💪.

use Illuminate\Support\Uri;
 
$uri = Uri::of('https://laravel-news.com')
->withPath('links')
->withQuery(['page' => 2])
->withFragment('new');
 
(string) $url; // https://laravel-news.com/links?page=2#new
 
$uri->path(); // links
$uri->scheme(); // https
$uri->port(); // null
$uri->host(); // laravel-news.com

Learn More

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Filed in

Sponsored

laravelcloud logo
Laravel Cloud

Easily create and manage your servers and deploy your Laravel applications in seconds.

Visit Laravel Cloud

The latest

View all →
Agent Run Observability in Laravel AI SDK 0.11 image

Agent Run Observability in Laravel AI SDK 0.11

Read article
Debounced Queued Event Listeners in Laravel image

Debounced Queued Event Listeners in Laravel

Read article
Statamic Mailables Viewer Previews Laravel Emails in the Control Panel image

Statamic Mailables Viewer Previews Laravel Emails in the Control Panel

Read article
Laravel Tackle: Run an AI Coding Agent in Your Laravel App image

Laravel Tackle: Run an AI Coding Agent in Your Laravel App

Read article
Queue::forward(): Reroute Laravel Queues in One Place image

Queue::forward(): Reroute Laravel Queues in One Place

Read article
Laravel Read-Through Filesystem: Lazy Storage Migration image

Laravel Read-Through Filesystem: Lazy Storage Migration

Read article