CurrentUrl


CurrentUrl предоставляет данные URL текущего HTTP-запроса через статические методы.

Поддерживает

  • получение полного URL
  • получение схемы и хоста
  • получение пути и его сегментов
  • получение query-строки и параметров
  • определение AJAX-запроса WebSource
  • проверку URL, переданного AJAX-запросом

Быстрый старт

php
$url = CurrentUrl::url();
$path = CurrentUrl::path();
$page = CurrentUrl::segment(0);
$parameter = CurrentUrl::parameter('page');

Создавать экземпляр класса не нужно.

Получение URL

url(): string

Возвращает полный URL текущего запроса.

php
$url = CurrentUrl::url();

Пример результата:

text
https://example.com/catalog/item?page=2

Метод возвращает нормализованный URL, а не неизменённую строку запроса. Путь приводится к нижнему регистру, повторяющиеся / объединяются, а завершающий / убирается.

Каждый сегмент пути получает URL-кодирование. Query-строка сохраняется без повторного кодирования и изменения регистра.

origin(): string

Возвращает схему, хост и порт, если он указан.

php
$origin = CurrentUrl::origin();

Пример результата:

text
https://example.com

host(): string

Возвращает хост без схемы.

php
$host = CurrentUrl::host();

scheme(): string

Возвращает схему запроса: http или https.

php
$scheme = CurrentUrl::scheme();

Работа с путём

path(bool $preserveCase = false): string

Возвращает путь без начальных и конечных символов /.

По умолчанию путь приводится к нижнему регистру. Передайте true, чтобы сохранить исходный регистр символов.

Для URL https://example.com/Catalog/Item:

php
$path = CurrentUrl::path(); // catalog/item
$originalPath = CurrentUrl::path(true); // Catalog/Item

Повторяющиеся / объединяются в один. Это действует и при path(true): параметр сохраняет регистр, но не отключает нормализацию пути.

Для запроса https://example.com//Catalog//Some%20Item/?sort=Title:

php
$url = CurrentUrl::url(); // https://example.com/catalog/some%20item?sort=Title
$path = CurrentUrl::path(); // catalog/some item
$originalPath = CurrentUrl::path(true); // Catalog/Some Item
$segments = CurrentUrl::segments(); // ['catalog', 'some item']

Таким образом, пробел в path() и элементах segments() представлен обычным символом, а в результате url() записан как %20.

Для корневого URL возвращается пустая строка.

Параметр не влияет на url(), segment() и segments(): путь в их результатах остаётся в нижнем регистре.

segment(int $index): ?string

Возвращает сегмент пути по индексу или null, если сегмент отсутствует.

php
$section = CurrentUrl::segment(0);
$page = CurrentUrl::segment(1);

segments(): array

Возвращает все сегменты пути.

php
$segments = CurrentUrl::segments();

Для пути catalog/item результат будет следующим:

php
[
    'catalog',
    'item'
]

Query-параметры

query(): string

Возвращает query-строку без символа ?.

php
$query = CurrentUrl::query();

Если query-строка отсутствует, метод возвращает пустую строку.

parameter(string $key): string|array|null

Возвращает значение query-параметра или null, если параметр отсутствует.

php
$page = CurrentUrl::parameter('page');

Массивы в query-строке обрабатываются стандартной функцией PHP parse_str():

text
filter[color]=blue&filter[size]=large
php
$filter = CurrentUrl::parameter('filter');

Результат:

php
[
    'color' => 'blue',
    'size' => 'large'
]

AJAX-запросы

isAjax(): bool

Возвращает true, если запрос распознан как AJAX-запрос WebSource.

php
if (CurrentUrl::isAjax()) {
    // Обработка AJAX-запроса
}

Для определения AJAX-запроса используются заголовки:

  • ws-ajax
  • was-url
  • sec-fetch-mode

URL из was-url принимается только при совпадении схемы, хоста и порта с текущим запросом. Внешний URL вызывает исключение.

При обычном переходе методы класса используют URL текущего HTTP-запроса. При подтверждённом AJAX-запросе они используют URL страницы из was-url.

Исключения

Исключение Когда возникает
RuntimeException Хост запроса отсутствует или содержит недопустимые символы.
RuntimeException Не удалось разобрать URL текущего запроса.
RuntimeException Путь содержит обратную косую черту, управляющие символы, . или ...
RuntimeException AJAX-заголовок содержит некорректный или внешний URL.

Ограничения и замечания

  • класс работает только с URL текущего запроса
  • класс не предназначен для разбора произвольных URL
  • схема определяется по REQUEST_SCHEME, HTTPS или SERVER_PORT
  • хост и схема приводятся к нижнему регистру
  • путь по умолчанию приводится к нижнему регистру; path(true) сохраняет исходный регистр
  • query-строка сохраняет исходный регистр
  • path(), segment() и segments() возвращают декодированные значения пути
  • url() возвращает URL с закодированными сегментами пути