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
baseUrl
je osnovni URL naslov aplikacije, vključno z domeno in delom poti do korenskega imenika aplikacijebasePath
je del poti do korenskega imenika aplikacijescriptPath
je pot do trenutnega skriptarelativePath
je ime skripta (po potrebi dodatni segmenti poti) relativno glede na basePathrelativeUrl
je celoten del URL-ja za baseUrl, vključno s query stringom in fragmentom.pathInfo
danes ž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.