Парсер и конструктор URL
Классы Url, UrlImmutable и UrlScript позволяют легко управлять, разбирать и манипулировать URL-адресами.
Url
Класс Nette\Http\Url позволяет легко работать с URL и его отдельными компонентами, которые показаны на этой диаграмме:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Генерация URL интуитивно понятна:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Вы также можете разобрать URL и затем манипулировать им:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Класс Url
реализует интерфейс JsonSerializable
и предоставляет
метод __toString()
, позволяющий распечатать объект или использовать
его с помощью json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Для получения или изменения отдельных компонентов URL доступны следующие методы:
Setter | Getter | Возвращаемое значение |
---|---|---|
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 |
'nette.org:8080' |
|
getHostUrl(): string |
'http://nette.org:8080' |
|
getAbsoluteUrl(): string |
полный URL |
Внимание: При работе с URL, полученным из HTTP-запроса, имейте в виду, что он не будет содержать фрагмент, поскольку браузер не отправляет его на сервер.
Мы также можем работать с отдельными параметрами запроса, используя:
Setter | Getter |
---|---|
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->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Проверяет, является ли URL-адрес абсолютным. URL считается абсолютным, если он начинается со схемы (например, http, https, ftp), за которой следует двоеточие.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Нормализует путь URL, удаляя специальные сегменты .
и ..
.
Этот метод удаляет лишние элементы пути так же, как это делают
браузеры.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
Класс Nette\Http\UrlImmutable
является неизменяемой альтернативой классу Url
(так же, как в PHP
DateTimeImmutable
является неизменяемой альтернативой DateTime
).
Вместо сеттеров он имеет так называемые withers, которые не изменяют
объект, а возвращают новые экземпляры с измененным значением:
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
->withUser('')
->withPassword('')
->withPath('/en/');
echo $newUrl; // 'http://nette.org:8080/en/?name=param#footer'
Класс UrlImmutable
реализует интерфейс JsonSerializable
и
предоставляет метод __toString()
, позволяющий распечатать объект или
использовать его с помощью json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Для получения или изменения отдельных компонентов URL доступны следующие методы:
Wither | Getter | Возвращаемое значение |
---|---|---|
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 |
'nette.org:8080' |
|
getHostUrl(): string |
'http://nette.org:8080' |
|
getAbsoluteUrl(): string |
полный URL |
Метод withoutUserInfo()
удаляет user
и password
.
Мы также можем работать с отдельными параметрами запроса, используя:
Wither | Getter | |
---|---|---|
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 строится относительно текущего пути.
$url = new UrlImmutable('https://example.com/path/page');
echo $url->resolve('../foo'); // 'https://example.com/foo'
echo $url->resolve('/bar'); // 'https://example.com/bar'
echo $url->resolve('sub/page.html'); // 'https://example.com/path/sub/page.html'
isEqual (string|Url $anotherUrl): bool
Проверяет, являются ли два URL одинаковыми.
$url->isEqual('https://nette.org');
UrlScript
Класс Nette\Http\UrlScript является
потомком класса UrlImmutable
и дополнительно различает эти
логические части URL:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
Для получения этих частей доступны следующие методы:
Getter | Возвращаемое значение |
---|---|
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() возвращает его.