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 →
WhenMounted and BigInt Props in Inertia.js v3.8 image

WhenMounted and BigInt Props in Inertia.js v3.8

Read article
Postcodes for Laravel: GB Postcode Lookup and Geography Data image

Postcodes for Laravel: GB Postcode Lookup and Geography Data

Read article
Laravel 14 Adds a defaults() Method to Eloquent Models image

Laravel 14 Adds a defaults() Method to Eloquent Models

Read article
Laravel AI SDK and Laravel MCP Security Fixes: Update Now image

Laravel AI SDK and Laravel MCP Security Fixes: Update Now

Read article
Mailbox for Laravel: Preview and Test Rendered Email image

Mailbox for Laravel: Preview and Test Rendered Email

Read article
Count Worker Crashes as Job Exceptions in Laravel 13.34 image

Count Worker Crashes as Job Exceptions in Laravel 13.34

Read article