URL builder

1.0.3 2024-03-20 07:27 UTC

This package is auto-updated.

Last update: 2024-09-20 09:11:25 UTC


README

Пакет содержит один класс. Решаемая задача: собирать url со всегда одинаковым порядком параметров, в формате, идентичном результату отправки формы.

Сборка url происходит в момент приведения объекта к строке. После сборки объект можно переиспользовать, его состояние не ломается.

Класс подготовлен для наследования. Переопределение нескольких методов позволит генерировать ЧПУ прозрачно для остальной части проекта. Пример ЧПУ.

Создание

$ub = new UB($path, $fields, $values);
  • $path — для относительного адреса это путь, для абсолютного — часть строки до знака ?.
  • $fields — порядок параметров при генерации URL. Параметры, которых нет в списке, попадают в конец строки.
  • $values — все параметры URL в формате [ключ => значение].

Все данные доступны для перезаписи через сеттеры.

Пример: сборка url из параметров.

print new UB(
    path:   '/catalog/',
    fields: ['price', 'producer_id'],
    values: [
                'producer_id' => [1, 2],
                'sort' => 'popularity',
                'price' => [
                    'max' => 20000,
                ],
            ],
);

Результат выполнения:

/catalog/?price%5Bmax%5D=20000&producer_id%5B%5D=1&producer_id%5B%5D=2&sort=popularity

Пример: создание объекта для текущего запроса.

new UB(
    path:   strtok($_SERVER['REQUEST_URI'], '?'),
    values: $_GET,
)

Пример: создание объекта из произвольного url.

function ub_from_url(string $url): UB
{
    parse_str(parse_url($url, PHP_URL_QUERY), $values);
    return new UB(
        path:   parse_url($url, PHP_URL_PATH),
        values: $values,
    );
}

$ub = ub_from_url('/catalog/?price%5Bmax%5D=20000&producer_id%5B%5D=1&producer_id%5B%5D=2&sort=popularity');
print $ub->getPath() . "\n";
print json_encode($ub->getAllValues()) . "\n";

Результат выполнения:

/catalog/
{"price":{"max":"20000"},"producer_id":["1","2"],"sort":"popularity"}

Если будет потребность, можно добавить в класс статическим методом.

Работа с данными

Все данные объекта доступны для чтения и записи через методы.

Можно изменять сам объект или создавать изменённую копию. Методы, отвечающие за каждый из способов, отличаются характерными названиями и сигнатурами. Копирующие методы возвращают копию (static), не копирующие — не возвращают ничего (void). Названия копирующих методов начинаются с предлогов with и without, у не копирующих — начинаются с глагола.

Имплементация ArrayAccess и IteratorAggregate работает по массиву параметров. Порядок обхода итератора не определён. Если будет потребность, можно сделать обход по порядку параметров в адресе.