URL Parser și Builder

Clasele Url, UrlImmutable și UrlScript facilitează gestionarea, analiza și manipularea URL-urilor.

Instalare și cerințe

Url

Clasa Nette\Http\Url facilitează lucrul cu URL-ul și cu componentele sale individuale, care sunt prezentate în această diagramă:

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'

Puteți, de asemenea, să analizați URL-ul și apoi să îl manipulați:

$url = new Url(
	'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);

Clasa Url implementează interfața JsonSerializable și furnizează metoda __toString(), făcând posibilă imprimarea obiectului sau utilizarea acestuia cu json_encode().

echo $url;
echo json_encode([$url]);

URL Components

Următoarele metode sunt disponibile pentru a obține sau a modifica componente URL individuale:

Setter | Getter | 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 'nette.org:8080'
  getHostUrl(): string 'http://nette.org:8080'
  getAbsoluteUrl(): string URL complet

Avertisment: Atunci când lucrați cu o adresă URL obținută în urma unei cereri HTTP, rețineți că aceasta nu va conține fragmentul, deoarece browserul nu îl trimite către server.

De asemenea, putem opera cu parametri de interogare individuali folosind:

Setter Getter
setQuery(string|array $query) getQueryParameters(): array
setQueryParameter(string $name, $val) getQueryParameter(string $name)

getDomain (int $level = 2)string

Returnează partea dreaptă sau stângă a gazdei. Iată cum funcționează 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) ''

isEqual (string|Url $anotherUrl)bool

Verifică dacă două URL-uri sunt identice.

$url->isEqual('https://nette.org');

Url::isAbsolute (string $url)bool

Verifică dacă un URL este absolut. Un URL este considerat absolut dacă începe cu o schemă (de exemplu, http, https, ftp) urmată de două puncte.

Url::isAbsolute('https://nette.org');    // true
Url::isAbsolute('//nette.org');          // false

Url::removeDotSegments (string $path)string

Normalizează o cale URL prin eliminarea segmentelor speciale . și ... Această metodă elimină elementele redundante ale căii în același mod în care o fac browserele.

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ă la clasa Url (la fel cum în PHP DateTimeImmutable este o alternativă imuabilă la DateTime). În loc de setters, aceasta are așa-numitele withers, care nu modifică obiectul, ci returnează noi instanțe cu o valoare 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('/en/');

echo $newUrl; // 'http://nette.org:8080/en/?name=param#footer'

Clasa UrlImmutable implementează interfața JsonSerializable și furnizează metoda __toString(), permițându-vă să tipăriți obiectul sau să îl utilizați cu json_encode().

echo $url;
echo json_encode([$url]);

URL Components

Următoarele metode sunt disponibile pentru a obține sau a modifica componente URL individuale:

Wither | Getter | 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 'nette.org:8080'
  getHostUrl(): string 'http://nette.org:8080'
  getAbsoluteUrl(): string URL complet

Metoda withoutUserInfo() elimină user și password.

De asemenea, putem opera cu parametrii de interogare individuali utilizând:

Wither Getter
withQuery(string|array $query) getQueryParameters(): array
withQueryParameter(string $name, $val) getQueryParameter(string $name)

getDomain (int $level = 2)string

Returnează partea dreaptă sau stângă a gazdei. Iată cum funcționează 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) ''

resolve (string $reference): UrlImmutable

Rezolvă un URL absolut în același mod în care un browser procesează linkurile de pe o pagină HTML:

  • Dacă link-ul este un URL absolut (conține o schemă), acesta este utilizat neschimbat.
  • Dacă legătura începe cu //, se aplică numai schema din URL-ul curent.
  • Dacă legătura î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|Url $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 distinge în plus aceste părți logice ale URL-ului:

     baseUrl    basePath  relativePath  relativeUrl
        |          |        |               |
/---------------/-----\/--------\---------------------------\
http://nette.org/admin/script.php/pathinfo/?name=param#footer
                \_______________/\________/
                       |              |
                  scriptPath       pathInfo

Următoarele metode sunt disponibile pentru a obține aceste părți:

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/'

Nu creăm obiecte UrlScript direct, dar metoda Nette\Http\Request::getUrl() îl returnează.

versiune: 4.0