Работа с URL адреси
Класовете Url, UrlImmutable и UrlScript позволяват лесно генериране, парсиране и манипулиране на URL адреси.
Url
Класът Nette\Http\Url позволява лесно да се работи с URL и неговите отделни компоненти, които са показани на тази схема:
схема  потребител  парола  хост   порт    път        заявка  фрагмент
  |      |      |        |      |       |            |       |
/--\   /--\ /------\ /-------\ /--\/----------\ /--------\ /----\
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 компоненти
За връщане или промяна на отделните компоненти на 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 | 
			'john:xyz%2A12@nette.org:8080' | 
		|
getHostUrl(): string | 
			'http://john:xyz%2A12@nette.org:8080' | 
		|
getAbsoluteUrl(): string | 
			цял URL | 
Предупреждение: Когато работите с URL, който е получен от HTTP заявка, имайте предвид, че той няма да съдържа фрагмент, тъй като браузърът не го изпраща на сървъра.
Можем да работим и с отделните query параметри с помощта на:
| 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 е immutable
(непроменлива) алтернатива на класа Url (подобно на това как
в PHP DateTimeImmutable е непроменлива алтернатива на DateTime). Вместо
сетъри има т.нар. withery, които не променят обекта, а връщат нови
екземпляри с променена стойност:
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
	'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
	->withUser('')
	->withPassword('')
	->withPath('/cs/');
echo $newUrl; // 'http://john:xyz%2A12@nette.org:8080/cs/?name=param#footer'
Класът UrlImmutable имплементира интерфейса JsonSerializable и има
метод __toString(), така че обектът може да бъде изведен или използван
в данни, предавани на json_encode().
echo $url;
echo json_encode([$url]);
URL компоненти
За връщане или промяна на отделните компоненти на 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 | 
			'john:xyz%2A12@nette.org:8080' | 
		|
getHostUrl(): string | 
			'http://john:xyz%2A12@nette.org:8080' | 
		|
getAbsoluteUrl(): string | 
			цял URL | 
Методът withoutUserInfo() премахва user и password.
Можем да работим и с отделните query параметри с помощта на:
| 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, като например коренната директория на проекта и др. Подобно на родителския клас, той е 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, включително query string и фрагмент.pathInfoднес вече малко използвана част от URL след името на скрипта
За връщане на части от URL са на разположение методите:
| 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() с вече правилно
зададени компоненти за текущата HTTP заявка.