Lucrul cu URL-uri
Clasele Url, UrlImmutable și UrlScript permit generarea, parsarea și manipularea ușoară a URL-urilor.
Url
Clasa Nette\Http\Url permite lucrul ușor cu URL-uri și componentele sale individuale, pe care le surprinde această schiță:
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
Generarea URL-urilor este intuitivă:
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Se poate, de asemenea, parsa un URL și manipula ulterior:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
Clasa Url
implementează interfața JsonSerializable
și are metoda __toString()
, astfel
încât obiectul poate fi afișat sau utilizat în datele transmise către json_encode()
.
echo $url;
echo json_encode([$url]);
Componentele URL
Pentru returnarea sau modificarea componentelor individuale ale URL-ului, aveți la dispoziție aceste metode:
Setter | Getter | Valoare returnată |
---|---|---|
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*12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
URL complet |
Atenție: Când lucrați cu un URL obținut dintr-o cerere HTTP, rețineți că nu va conține fragmentul, deoarece browserul nu îl trimite către server.
Putem lucra și cu parametrii query individuali folosind:
Setter | Getter |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name): ?string |
getDomain (int $level = 2): ?string
Returnează partea dreaptă sau stângă a gazdei. Funcționează astfel dacă gazda este 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) |
null |
isEqual (string|Url $anotherUrl): bool
Verifică dacă două URL-uri sunt identice.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Verifică dacă URL-ul este absolut. Un URL este considerat absolut dacă începe cu o schemă (de ex., http, https, ftp) urmată de două puncte.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normalizează calea în URL prin eliminarea segmentelor speciale .
și ..
. Metoda elimină elementele
redundante ale căii în același mod în care o fac browserele web.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
Clasa Nette\Http\UrlImmutable este o alternativă
imuabilă (nu poate fi modificată) a clasei Url (similar cu modul în care în PHP
DateTimeImmutable
este alternativa imuabilă a DateTime
). În loc de setteri, are așa-numiți witheri,
care nu modifică obiectul, ci returnează noi instanțe cu valoarea modificată:
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'
Clasa UrlImmutable
implementează interfața JsonSerializable
și are metoda
__toString()
, astfel încât obiectul poate fi afișat sau utilizat în datele transmise către
json_encode()
.
echo $url;
echo json_encode([$url]);
Componentele URL
Pentru returnarea sau modificarea componentelor individuale ale URL-ului servesc metodele:
Wither | Getter | Valoare returnată |
---|---|---|
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*12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
URL complet |
Metoda withoutUserInfo()
elimină user
și password
.
Putem lucra și cu parametrii query individuali folosind:
Wither | Getter |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name): ?string |
getDomain (int $level = 2): ?string
Returnează partea dreaptă sau stângă a gazdei. Funcționează astfel dacă gazda este 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) |
null |
resolve (string $reference): UrlImmutable
Derivă un URL absolut în același mod în care un browser procesează linkurile pe o pagină HTML:
- dacă linkul este un URL absolut (conține o schemă), este utilizat neschimbat
- dacă linkul începe cu
//
, se preia doar schema din URL-ul curent - dacă linkul începe cu
/
, se creează o cale absolută de la rădăcina domeniului - în celelalte cazuri, URL-ul este construit relativ la calea curentă
$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|UrlImmutable $anotherUrl): bool
Verifică dacă două URL-uri sunt identice.
$url->isEqual('https://nette.org');
UrlScript
Clasa Nette\Http\UrlScript este un descendent al UrlImmutable și îl extinde cu alte componente virtuale ale URL-ului, cum ar fi directorul rădăcină al proiectului etc. La fel ca clasa părinte, este un obiect imuabil (nu poate fi modificat).
Următoarea diagramă afișează componentele pe care UrlScript le recunoaște:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
este adresa URL de bază a aplicației, inclusiv domeniul și partea căii către directorul rădăcină al aplicațieibasePath
este partea căii către directorul rădăcină al aplicațieiscriptPath
este calea către scriptul curentrelativePath
este numele scriptului (eventual alte segmente ale căii) relativ la basePathrelativeUrl
este întreaga parte a URL-ului după baseUrl, inclusiv query string și fragment.pathInfo
este o parte a URL-ului, astăzi puțin utilizată, după numele scriptului
Pentru returnarea părților URL-ului sunt disponibile metodele:
Getter | Valoare returnată |
---|---|
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/' |
Obiectele UrlScript
de obicei nu le creăm direct, ci le returnează metoda Nette\Http\Request::getUrl() cu componentele deja setate corect pentru cererea
HTTP curentă.