В дальнейшей работе мне понадобится много обращаться к адресной строке браузера и на основе запроса пользователя перенаправлять его на нужную страницу.
Для этого я написал класс для работы с URL в нём я активно использую стандартную функцию PHP parse_url() и свой класс DataCleaner для очистки.
Здесь я тоже посторался учеть как можно больше вариантов использования которые мне могут понадобиться в дальнейшем.
Покажу весь код сразу:
<?php
class UrlParse
{
private $url = [];
private $query = [];
public function __construct()
{
$this->url = explode('/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
$this->query = explode('&', parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY));
}
/**
* Возвращает массив частей URL расделённых /
* @return array
*/
public function getUrlPath() :array
{
return DataCleaner::cleanStringArray($this->url);
}
/**
* Возвращает количество элементов в массиве URL
* @return int
*/
public function getCountUrlPath() :int
{
return count($this->getUrlPath());
}
/**
* Возвращает значение массива URL по ключу
* Если значение ключа больше чем элеменов массива
* вернёт пустую строку
*
* @param int $num
* @return string
*/
public function getByNumUrlPath($num) :string
{
if(!is_int($num)) {
throw new Exception('Передан неверный тип параметра в метод ' . __METHOD__ .
' здесь ожидается число');
}
$url = DataCleaner::cleanStringArray($this->url);
$col = $this->getCountUrlPath();
if($num > $col) {
return '';
}
return $url[$num];
}
/**
* Возвращает следующий элемент URL после запрашиваемого
* если запрашиваемый элемент последний
* вернёт пустую строку
* @param string $query
* @return string
*/
public function getNextUrlPath($query) :string
{
$key = array_search($query, $this->url);
if (array_key_exists($key + 1, $this->url)) {
$item = $this->url[$key + 1];
$item = DataCleaner::cleanString($item);
return $item;
}
return '';
}
/**
* Возвращает массив с запросов в URL
*
* @return array
*/
public function getQueryUrl() :array
{
return DataCleaner::cleanStringArray($this->query);
}
/**
* Возвращает значение запроса в URL по ключу
* если ключ не существует
* вернёт пустую строку
*
* @param string $key
* @return int|string
*/
public function getQueryValueUrl($key)
{
foreach ($this->query as $item) {
$keyQuery = explode('=', $item);
if ($keyQuery[0] === $key) {
$value = $keyQuery[1];
return $value;
}
}
return '';
}
}
Теперь посмотрим что получилось, буду разбирать условный URL mysite.ru/cpanel/users/?user=23&post=12
Метод getUrlPath() — Возвращает массив частей URL расделённых /
array (size=4)
0 => string '' (length=0)
1 => string 'cpanel' (length=6)
2 => string 'users' (length=5)
3 => string '' (length=0)
Метод getCountUrlPath() — Возвращает количество элементов в массиве URL
Метод getByNumUrlPath() принимает в качестве параметра число и возвращает значение массива URL по ключу. Если значение ключа больше чем элеменов массива вернёт пустую строку
Метод getNextUrlPath() — Возвращает следующий элемент URL после запрашиваемого. Если запрашиваемый элемент последний вернёт пустую строку.
Метод getQueryUrl() — Возвращает массив с запросов в URL.
Метод getQueryValueUrl($key) — Возвращает значение запроса в URL по ключу. Если ключ не существует вернёт пустую строку.