Работа с URI
CodeIgniter предоставляет объектно-ориентированное решение для работы с URI в вашем приложении. Использование этого решения упрощает обеспечение правильной структуры, независимо от сложности URI, а также добавление относительных URI к существующему URI с безопасным и корректным разрешением.
Создание экземпляров URI
Создание экземпляра URI так же просто, как создание нового экземпляра класса:
$uri = new \CodeIgniter\HTTP\URI();
В качестве альтернативы, вы можете использовать функцию service() для получения экземпляра:
$uri = service('uri');
При создании нового экземпляра вы можете передать полный или частичный URL в конструктор, и он будет разобран на соответствующие части:
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
$uri = service('uri', 'http://www.example.com/some/path');
Текущий URI
Многие разы вам нужен всего лишь объект, представляющий текущий URL этого запроса. Вы можете использовать одну из функций, доступных в url_helper:
$uri = current_url(true);
Вы должны передать true в качестве первого параметра, в противном случае будет возвращена строка представления текущего URL. Этот URI основан на пути (относительно вашего baseURL) как определено текущим объектом запроса и вашими настройками в Config\App (baseURL, indexPage и forceGlobalSecureRequests). Предполагая, что вы находитесь в контроллере, который расширяет CodeIgniter\Controller, вы можете получить этот относительный путь:
$path = $this->request->getPath();
Строки URI
Многие разы вам нужен всего лишь строковое представление URI. Это легко сделать, просто представив URI как строку:
$uri = current_url(true); echo (string) $uri; // http://example.com/index.php
Если вы знаете части URI и просто хотите убедиться, что все отформатировано правильно, вы можете сгенерировать строку, используя статический метод класса URI createURIString().
$uriString = URI::createURIString($scheme, $authority, $path, $query, $fragment);
// Creates: http://exmample.com/some/path?foo=bar#first-heading
echo URI::createURIString('http', 'example.com', 'some/path', 'foo=bar', 'first-heading');
Важно
При преобразовании URI в строку будет выполнена попытка корректировки URL проекта в соответствии с настройками, определенными в Config\App. Если вам нужно точное, неизмененное строковое представление, используйте URI::createURIString() вместо этого.
Части URI
После получения экземпляра URI вы можете установить или получить любую из различных частей URI. Этот раздел предоставит подробности о том, что представляют собой эти части, и о том, как с ними работать.
Схема
Схема часто является ‘http’ или ‘https’, но поддерживается любая схема, включая ‘file’, ‘mailto’ и т.д.
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
echo $uri->getScheme(); // 'http'
$uri->setScheme('https');
Авторитет
Многие URI содержат несколько элементов, которые вместе известны как «авторитет». Это включает в себя любые данные пользователя, хост и номер порта. Вы можете получить все эти части как одну строку с помощью метода getAuthority(), или вы можете манипулировать отдельными частями.
$uri = new \CodeIgniter\HTTP\URI('ftp://user:password@example.com:21/some/path');
echo $uri->getAuthority(); // user@example.com:21
По умолчанию эта часть не будет отображать пароль, так как вам не нужно его показывать. Если вы хотите отобразить пароль, вы можете использовать метод showPassword(). Этот экземпляр URI будет продолжать отображать пароль, пока вы его не отключите, поэтому всегда убедитесь, что вы его отключили, как только закончите работу:
echo $uri->getAuthority(); // user@example.com:21 echo $uri->showPassword()->getAuthority(); // user:password@example.com:21 // Turn password display off again. $uri->showPassword(false);
Если вы не хотите отображать порт, передайте true в качестве единственного параметра:
echo $uri->getAuthority(true); // user@example.com
Примечание
Если текущий порт является стандартным портом для схемы, он никогда не будет отображаться.
Данные пользователя
Раздел данных пользователя — это просто имя пользователя и пароль, которые вы можете увидеть в URI FTP. Хотя вы можете получить это как часть авторитета, вы также можете получить это самостоятельно:
echo $uri->getUserInfo(); // user
По умолчанию пароль не будет отображаться, но вы можете переопределить это с помощью метода showPassword().
echo $uri->showPassword()->getUserInfo(); // user:password $uri->showPassword(false);
Хост
Часть хоста URI обычно является доменным именем URL. Это легко установить и получить с помощью методов getHost() и setHost().
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
echo $uri->getHost(); // www.example.com
echo $uri->setHost('anotherexample.com')->getHost(); // anotherexample.com
Порт
Порт — это целое число от 0 до 65535. Для каждой схемы существует значение по умолчанию.
$uri = new \CodeIgniter\HTTP\URI('ftp://user:password@example.com:21/some/path');
echo $uri->getPort(); // 21
echo $uri->setPort(2201)->getPort(); // 2201
При использовании метода setPort(), порт будет проверен на соответствие допустимому диапазону и назначен.
Путь
Путь — это все сегменты внутри самого сайта. Как ожидается, методы getPath() и setPath() могут использоваться для его изменения:
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path');
echo $uri->getPath(); // 'some/path'
echo $uri->setPath('another/path')->getPath(); // 'another/path'
Примечание
При установке пути таким образом, или любым другим способом, который позволяет класс, он очищается для кодирования потенциально опасных символов и удаления точечных сегментов для безопасности.
Запрос
Переменные запроса могут быть изменены через класс с помощью простых строковых представлений. В настоящее время значения запроса могут быть установлены только как строки.
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com?foo=bar');
echo $uri->getQuery(); // 'foo=bar'
$uri->setQuery('foo=bar&bar=baz');
Примечание
Значения запроса не могут содержать фрагменты. Если это происходит, будет выброшено исключение InvalidArgumentException.
Вы можете установить значения запроса с помощью массива:
$uri->setQueryArray(['foo' => 'bar', 'bar' => 'baz']);
Методы setQuery() и setQueryArray() перезаписывают все существующие переменные запроса. Вы можете добавить значение в коллекцию переменных запроса без разрушения существующих переменных запроса с помощью метода addQuery(). Первый параметр — имя переменной, а второй — значение:
$uri->addQuery('foo', 'bar');
Фильтрация значений запроса
Вы можете отфильтровать возвращаемые значения запроса, передав массив опций методу getQuery(), с ключом only или except:
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com?foo=bar&bar=baz&baz=foz');
// Returns 'foo=bar'
echo $uri->getQuery(['only' => ['foo']);
// Returns 'foo=bar&baz=foz'
echo $uri->getQuery(['except' => ['bar']]);
Это изменяет только значения, возвращаемые во время этого вызова. Если вам нужно более постоянно изменить значения запроса URI, вы можете использовать методы stripQuery() и keepQuery() для изменения фактической коллекции переменных запроса объекта:
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com?foo=bar&bar=baz&baz=foz');
// Leaves just the 'baz' variable
$uri->stripQuery('foo', 'bar');
// Leaves just the 'foo' variable
$uri->keepQuery('foo');
Примечание
По умолчанию методы setQuery() и setQueryArray() используют функцию parse_str() для подготовки данных. Если вы хотите использовать более либеральные правила (которые позволяют именам ключей содержать точки), вы можете предварительно использовать специальный метод useRawQueryString().
Фрагмент
Фрагменты — это часть URL в конце, предваряемая знаком решетки (#). В URL HTML они являются ссылками на анкоры на странице. URI мультимедиа могут использовать их различными другими способами.
$uri = new \CodeIgniter\HTTP\URI('http://www.example.com/some/path#first-heading');
echo $uri->getFragment(); // 'first-heading'
echo $uri->setFragment('second-heading')->getFragment(); // 'second-heading'
Сегменты URI
Каждая часть пути между косыми чертами является отдельным сегментом. Класс URI предоставляет простой способ определения значений сегментов. Сегменты начинаются с 1, будучи крайними слева в пути.
// URI = http://example.com/users/15/profile
// Prints '15'
if ($uri->getSegment(1) == 'users') {
echo $uri->getSegment(2);
}
Вы также можете установить другое значение по умолчанию для определенного сегмента, используя второй параметр метода getSegment(). Значение по умолчанию — пустая строка.
// URI = http://example.com/users/15/profile // will print 'profile' echo $uri->getSegment(3, 'foo'); // will print 'bar' echo $uri->getSegment(4, 'bar'); // will throw an exception echo $uri->getSegment(5, 'baz'); // will print 'baz' echo $uri->setSilent()->getSegment(5, 'baz'); // will print '' (empty string) echo $uri->setSilent()->getSegment(5);
Вы можете получить количество всех сегментов:
$total = $uri->getTotalSegments(); // 3
Наконец, вы можете получить массив всех сегментов:
$segments = $uri->getSegments();
// $segments =
[
0 => 'users',
1 => '15',
2 => 'profile'
]
Отключение выброса исключений
По умолчанию некоторые методы этого класса могут генерировать исключения. Если вы хотите это отключить, вы можете установить специальный флаг, который предотвратит выброс исключений.
// Disable throwing exceptions $uri->setSilent(); // Enable throwing exceptions (default) $uri->setSilent(false);
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/libraries/uri.html