PHP 8.5 представляє нове розширення для роботи з URI.

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 15 жовтня, 2025
PHP 8.5 приносить нове розширення URI, яке відповідає стандартам та значно полегшує роботу з URL. Дізнайтеся, як Laravel, використовуючи потужний клас URI, може спростити ваші проєкти, і чому вам варто впровадити ці нові можливості у своєму коді

PHP 8.5 презентує нове URI-розширення, яке є стандартним парсером, що відповідає вимогам RFC 3986 і стандарту URL WHATWG, та завжди доступне в стандартній бібліотеці під назвою 'URI'. Документ RFC містить безліч прикладів, ось один з них з посту-анонсу PHP Foundation, що демонструє клас Uri для RFC 3986:

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,
};
 
// Видалення стандартних портів з URL.
if ($url->getPort() === $defaultPortForScheme) {
    $url = $url->withPort(null);
}
 
// Геттери нормалізують URL за замовчуванням. Варіанти `Raw` 
// повертають введене значення без змін.
 
echo $url->toString(), PHP_EOL;
// Виводить: https://thephp.foundation/sponsor/
echo $url->toRawString(), PHP_EOL;
// Виводить: HTTPS://thephp.foundation/sp%6Fnsor/

У разі виникнення помилки парсингу створення нового екземпляра викличе виняток UrlValidationError, а статичний метод parse() поверне помилки в переданій змінній:

$url = new Uri\WhatWg\Url("invalid url");
// Виникає Uri\WhatWg\InvalidUrlException
 
$errors = [];
$url = Uri\WhatWg\Url::parse("invalid url", null, $errors);
// Повертається null, а масив об'єктів UrlValidationError
// передається за посиланням до $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 у Laravel

Хоча важливо, що PHP 8.5 запроваджує компонент URI, сумісний з RFC, для широкої спільноти PHP знадобиться деякий час, щоб повною мірою використати його можливості. Наприклад, поки фреймворки на зразок Laravel не визначать PHP 8.5 як мінімально необхідну версію, вони не зможуть використовувати його нові можливості. Проте ви можете використовувати функції PHP 8.5 у своєму додатку, навіть якщо фреймворки відстають на одну-дві версії.

Тим часом клас URI, введений у Laravel 11.35, використовує пакет league/uri, який реалізує RFC 3986. Клас URI Laravel є потужним і буде працювати з 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

# Дізнайтеся більше