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 →
PayZephyr: One Payment API for Stripe, Paystack, and PayPal image

PayZephyr: One Payment API for Stripe, Paystack, and PayPal

Read article
Bifrost Turns One With AI Builds and New Workflows image

Bifrost Turns One With AI Builds and New Workflows

Read article
Preview Blade Templates in macOS Finder with Quick Blade image

Preview Blade Templates in macOS Finder with Quick Blade

Read article
Artisan Debugging Commands in Laravel Telescope 5.24.0 image

Artisan Debugging Commands in Laravel Telescope 5.24.0

Read article
Queue totalSize() and JobInterrupted Event in Laravel 13.31 image

Queue totalSize() and JobInterrupted Event in Laravel 13.31

Read article
Find Unexpected Test Inputs with Fuzz for Pest image

Find Unexpected Test Inputs with Fuzz for Pest

Read article