Работа с 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 заявка.