Работа с URL
Классы Url, UrlImmutable и UrlScript позволяют легко генерировать, парсить и манипулировать URL.
Url
Класс api:Nette\Http\Url позволяет легко работать с URL и его отдельными компонентами, которые отражены на этой схеме:
схема пользователь пароль хост порт путь запрос фрагмент | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Генерация URL интуитивно понятна:
Также можно распарсить URL и далее манипулировать им:
Класс Url
реализует интерфейс JsonSerializable
и имеет метод
__toString()
, так что объект можно вывести или использовать в данных,
передаваемых в json_encode()
.
Компоненты URL
Для возврата или изменения отдельных компонентов URL вам доступны следующие методы:
Сеттер | Геттер | Возвращаемое значение |
---|---|---|
setScheme(string $scheme) |
getScheme(): string |
'http' |
setUser(string $user) |
getUser(): string |
'john' |
setPassword(string $password) |
getPassword(): string |
'xyz*12' |
setHost(string $host) |
getHost(): string |
'nette.org' |
setPort(int $port) |
getPort(): ?int |
8080 |
getDefaultPort(): ?int |
80 |
|
setPath(string $path) |
getPath(): string |
'/en/download' |
setQuery(string|array $query) |
getQuery(): string |
'name=param' |
setFragment(string $fragment) |
getFragment(): string |
'footer' |
getAuthority(): string |
'john:xyz%2A12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
весь URL |
Предупреждение: Когда вы работаете с URL, полученным из HTTP-запроса, имейте в виду, что он не будет содержать фрагмент, так как браузер не отправляет его на сервер.
Мы можем работать и с отдельными query-параметрами с помощью:
Сеттер | Геттер |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Возвращает правую или левую часть хоста. Так это работает, если хост
www.nette.org
:
getDomain(1) |
'org' |
getDomain(2) |
'nette.org' |
getDomain(3) |
'www.nette.org' |
getDomain(0) |
'www.nette.org' |
getDomain(-1) |
'www.nette' |
getDomain(-2) |
'www' |
getDomain(-3) |
'' |
isEqual(string|Url $anotherUrl): bool
Проверяет, идентичны ли два URL.
Url::isAbsolute(string $url): bool
Проверяет, является ли URL абсолютным. URL считается абсолютным, если он начинается со схемы (например, http, https, ftp), за которой следует двоеточие.
Url::removeDotSegments(string $path): string
Нормализует путь в URL, удаляя специальные сегменты .
и ..
.
Метод удаляет избыточные элементы пути тем же способом, как это делают
веб-браузеры.
UrlImmutable
Класс api:Nette\Http\UrlImmutable
является immutable (неизменяемой) альтернативой классу Url
(подобно тому, как в PHP DateTimeImmutable
является неизменяемой
альтернативой DateTime
). Вместо сеттеров у него есть так называемые
withers, которые не изменяют объект, а возвращают новые экземпляры с
измененным значением:
Класс UrlImmutable
реализует интерфейс JsonSerializable
и имеет
метод __toString()
, так что объект можно вывести или использовать в
данных, передаваемых в json_encode()
.
Компоненты URL
Для возврата или изменения отдельных компонентов URL служат методы:
Wither | Геттер | Возвращаемое значение |
---|---|---|
withScheme(string $scheme) |
getScheme(): string |
'http' |
withUser(string $user) |
getUser(): string |
'john' |
withPassword(string $password) |
getPassword(): string |
'xyz*12' |
withHost(string $host) |
getHost(): string |
'nette.org' |
withPort(int $port) |
getPort(): ?int |
8080 |
getDefaultPort(): ?int |
80 |
|
withPath(string $path) |
getPath(): string |
'/en/download' |
withQuery(string|array $query) |
getQuery(): string |
'name=param' |
withFragment(string $fragment) |
getFragment(): string |
'footer' |
getAuthority(): string |
'john:xyz%2A12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
весь URL |
Метод withoutUserInfo()
удаляет user
и password
.
Мы можем работать и с отдельными query-параметрами с помощью:
Wither | Геттер |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Возвращает правую или левую часть хоста. Так это работает, если хост
www.nette.org
:
getDomain(1) |
'org' |
getDomain(2) |
'nette.org' |
getDomain(3) |
'www.nette.org' |
getDomain(0) |
'www.nette.org' |
getDomain(-1) |
'www.nette' |
getDomain(-2) |
'www' |
getDomain(-3) |
'' |
resolve(string $reference): UrlImmutable
Выводит абсолютный URL тем же способом, каким браузер обрабатывает ссылки на HTML-странице:
- если ссылка является абсолютным URL (содержит схему), она используется без изменений
- если ссылка начинается с
//
, берется только схема из текущего URL - если ссылка начинается с
/
, создается абсолютный путь от корня домена - в остальных случаях URL составляется относительно текущего пути
isEqual(string|Url $anotherUrl): bool
Проверяет, идентичны ли два URL.
UrlScript
Класс api:Nette\Http\UrlScript является потомком UrlImmutable и расширяет его дополнительными виртуальными компонентами URL, такими как корневой каталог проекта и т.д. Как и родительский класс, это immutable (неизменяемый) объект.
Следующая диаграмма отображает компоненты, которые распознает UrlScript:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
— это базовый URL-адрес приложения, включая домен и часть пути к корневому каталогу приложенияbasePath
— это часть пути к корневому каталогу приложенияscriptPath
— это путь к текущему скриптуrelativePath
— это имя скрипта (возможно, с дополнительными сегментами пути) относительно basePathrelativeUrl
— это вся часть URL после baseUrl, включая строку запроса и фрагмент.pathInfo
— сегодня уже малоиспользуемая часть URL после имени скрипта
Для возврата частей URL доступны методы:
Геттер | Возвращаемое значение |
---|---|
getScriptPath(): string |
'/admin/script.php' |
getBasePath(): string |
'/admin/' |
getBaseUrl(): string |
'http://nette.org/admin/' |
getRelativePath(): string |
'script.php' |
getRelativeUrl(): string |
'script.php/pathinfo/?name=param#footer' |
getPathInfo(): string |
'/pathinfo/' |
Объекты UrlScript
обычно не создаются напрямую, но их возвращает
метод Nette\Http\Request::getUrl() с уже правильно настроенными
компонентами для текущего HTTP-запроса.