artklen / ub
URL builder
Requires
- php: >=8.0
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
работает по массиву параметров.
Порядок обхода итератора не определён. Если будет потребность, можно сделать обход по порядку
параметров в адресе.