Delo z URL-ji
Razreda Url, UrlImmutable in UrlScript omogočata enostavno generiranje, razčlenjevanje in manipulacijo z URL-ji.
Url
Razred Nette\Http\Url omogoča enostavno delo z URL-ji in njihovimi posameznimi komponentami, ki jih zajema ta skica:
shema uporabnik geslo gostitelj vrata pot poizvedba fragment
| | | | | | | |
/--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\
http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer
\______\__________________________/
| |
hostUrl avtoriteta
Generiranje URL-jev je intuitivno:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Lahko tudi URL razčlenite in ga nadalje manipulirate:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Razred Url implementira vmesnik JsonSerializable in ima metodo __toString(), tako da
lahko objekt izpišete ali uporabite v podatkih, predanih v json_encode().
echo $url;
echo json_encode([$url]);
Komponente URL
Za vračanje ali spreminjanje posameznih komponent URL-ja so vam na voljo te metode:
| Setter | Getter | Vrnjena vrednost |
|---|---|---|
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 |
celoten URL |
Opozorilo: Ko delate z URL-jem, ki je pridobljen iz zahteve HTTP, imejte v mislih, da ne bo vseboval fragmenta, ker ga brskalnik ne pošilja na strežnik.
Lahko delamo tudi s posameznimi query parametri s pomočjo:
| Setter | Getter |
|---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
Vrača desni ali levi del gostitelja. Tako deluje, če je gostitelj 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
Preveri, ali sta dva URL-ja enaka.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Preverja, ali je URL absoluten. URL se šteje za absoluten, če se začne s shemo (npr. http, https, ftp), ki ji sledi dvopičje.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normalizira pot v URL-ju z odstranitvijo posebnih segmentov . in ... Metoda odstranjuje odvečne
elemente poti na enak način, kot to počnejo spletni brskalniki.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
Razred Nette\Http\UrlImmutable je nespremenljiva
(immutable) alternativa razredu Url (podobno kot je v PHP DateTimeImmutable nespremenljiva
alternativa DateTime). Namesto nastavitvenih metod ima t.i. wither metode, ki objekta ne spreminjajo, ampak vračajo
nove instance s prilagojeno vrednostjo:
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'
Razred UrlImmutable implementira vmesnik JsonSerializable in ima metodo __toString(),
tako da lahko objekt izpišete ali uporabite v podatkih, predanih v json_encode().
echo $url;
echo json_encode([$url]);
Komponente URL
Za vračanje ali spreminjanje posameznih komponent URL-ja služijo metode:
| Wither | Getter | Vrnjena vrednost |
|---|---|---|
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 |
celoten URL |
Metoda withoutUserInfo() odstranjuje user in password.
Lahko delamo tudi s posameznimi query parametri s pomočjo:
| Wither | Getter |
|---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
Vrača desni ali levi del gostitelja. Tako deluje, če je gostitelj 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
Izpelje absolutni URL na enak način, kot brskalnik obdeluje povezave na HTML strani:
- če je povezava absolutni URL (vsebuje shemo), se uporabi nespremenjena
- če se povezava začne z
//, se prevzame samo shema iz trenutnega URL-ja - če se povezava začne z
/, se ustvari absolutna pot od korena domene - v ostalih primerih se URL sestavi relativno glede na trenutno pot
$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
Preveri, ali sta dva URL-ja enaka.
$url->isEqual('https://nette.org');
UrlScript
Razred Nette\Http\UrlScript je potomec UrlImmutable in ga razširja z dodatnimi virtualnimi komponentami URL-ja, kot je korenski imenik projekta ipd. Tako kot starševski razred je nespremenljiv (immutable) objekt.
Naslednji diagram prikazuje komponente, ki jih UrlScript prepoznava:
baseUrl basePath relativePath relativeUrl
| | | |
/---------------/-----\/--------\---------------------------\
http://nette.org/admin/script.php/pathinfo/?name=param#footer
\_______________/\________/
| |
scriptPath pathInfo
baseUrlje osnovni URL naslov aplikacije, vključno z domeno in delom poti do korenskega imenika aplikacijebasePathje del poti do korenskega imenika aplikacijescriptPathje pot do trenutnega skriptarelativePathje ime skripta (po potrebi dodatni segmenti poti) relativno glede na basePathrelativeUrlje celoten del URL-ja za baseUrl, vključno s query stringom in fragmentom.pathInfodanes že malo uporabljen del URL-ja za imenom skripta
Za vračanje delov URL-ja so na voljo metode:
| Getter | Vrnjena vrednost |
|---|---|
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/' |
Objektov UrlScript običajno ne ustvarjamo neposredno, ampak jih vrača metoda Nette\Http\Request::getUrl() z že pravilno nastavljenimi komponentami za
trenutno HTTP zahtevo.