Práce s URL
Třídy Url, UrlImmutable a UrlScript umožňují snadné generování, parsování a manipulaci s URL.
Url
Třída Nette\Http\Url umožňuje snadno pracovat s URL a jednotlivými jeho komponentami, které zachycuje tento nákres:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Generování URL je intuitivní:
Lze také URL naparsovat a dále s ním manipulovat:
Třída Url
implementuje rozhraní JsonSerializable
a má metodu __toString()
, takže
objekt lze vypsat nebo použít v datech předávaných do json_encode()
.
Komponenty URL
Pro vrácení nebo změnu jednotlivých komponent URL jsou vám k dispozici tyto metody:
Setter | Getter | Vrácená hodnota |
---|---|---|
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 |
celá URL |
Upozornění: Když pracujete s URL, které je získáno z HTTP requestu, mějte na paměti, že nebude obsahovat fragment, protože prohlížeč jej neodesílá na server.
Můžeme pracovat i s jednotlivými query parametry pomocí:
Setter | Getter |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Vrací pravou či levou část hostitele. Takto funguje, pokud host je 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
Ověří, zda jsou dvě URL shodné.
Url::isAbsolute(string $url): bool
Ověřuje, zda je URL absolutní. URL je považována za absolutní, pokud začíná schématem (např. http, https, ftp) následovaným dvojtečkou.
Url::removeDotSegments(string $path): string
Normalizuje cestu v URL odstraněním speciálních segmentů .
a ..
. Metoda odstraňuje
nadbytečné prvky cesty stejným způsobem, jako to dělají webové prohlížeče.
UrlImmutable
Třída Nette\Http\UrlImmutable je immutable
(neměnnou) alternativou třídy Url (podobně jako je v PHP DateTimeImmutable
neměnnou
alternativou DateTime
). Místo setterů má tzv. withery, které objekt nemění, ale vracejí nové instance
s upravenou hodnotou:
Třída UrlImmutable
implementuje rozhraní JsonSerializable
a má metodu __toString()
,
takže objekt lze vypsat nebo použít v datech předávaných do json_encode()
.
Komponenty URL
Pro vrácení nebo změnu jednotlivých komponent URL slouží metody:
Wither | Getter | Vrácená hodnota |
---|---|---|
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 |
celá URL |
Metoda withoutUserInfo()
odstraňuje user
a password
.
Můžeme pracovat i s jednotlivými query parametry pomocí:
Wither | Getter |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Vrací pravou či levou část hostitele. Takto funguje, pokud host je 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
Odvozuje absolutní URL stejným způsobem, jakým prohlížeč zpracovává odkazy na HTML stránce:
- pokud je odkaz absolutní URL (obsahuje schéma), použije se beze změny
- pokud odkaz začíná
//
, převezme se pouze schéma z aktuální URL - pokud odkaz začíná
/
, vytvoří se absolutní cesta od kořene domény - v ostatních případech se URL sestaví relativně vůči aktuální cestě
isEqual(string|Url $anotherUrl): bool
Ověří, zda jsou dvě URL shodné.
UrlScript
Třída Nette\Http\UrlScript je potomkem UrlImmutable a rozšiřuje jej o další virtuální komponenty URL, jako je kořenový adresáři projektu apod. Stejně jako rodičovská třída je immutable (neměnným) objektem.
Následující diagram zobrazuje komponenty, které UrlScript rozpoznává:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
je základní URL adresa aplikace včetně domény a části cesty ke kořenovému adresáři aplikacebasePath
je část cesty ke kořenovému adresáři aplikacescriptPath
je cesta k aktuálnímu skripturelativePath
je název skriptu (případně další segmenty cesty) relativní k basePathrelativeUrl
je celá část URL za baseUrl, včetně query string a fragmentu.pathInfo
dnes už málo využívaná část URL za názvem skriptu
Pro vrácení částí URL jsou k dispozici metody:
Getter | Vrácená hodnota |
---|---|
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/' |
Objekty UrlScript
obvykle přímo nevytváříme, ale vrací jej metoda Nette\Http\Request::getUrl() s již správně nastavenými komponentami pro aktuální HTTP
požadavek.