Parser e costruttore di URL

Le classi Url, UrlImmutable e UrlScript semplificano la gestione, l'analisi e la manipolazione degli URL.

Installazione e requisiti

Url

La classe Nette\Http\Url semplifica il lavoro con l'URL e i suoi singoli componenti, che sono illustrati in questo diagramma:

scheme  user  password  host   port    path        query  fragment
  |      |      |        |      |       |            |       |
/--\   /--\ /------\ /-------\ /--\/----------\ /--------\ /----\
http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer
\______\__________________________/
    |               |
 hostUrl        authority

La generazione di URL è intuitiva:

use Nette\Http\Url;

$url = new Url;
$url->setScheme('https')
	->setHost('localhost')
	->setPath('/edit')
	->setQueryParameter('foo', 'bar');

echo $url; // 'https://localhost/edit?foo=bar'

È anche possibile analizzare l'URL e poi manipolarlo:

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

La classe Url implementa l'interfaccia JsonSerializable e fornisce il metodo __toString(), che consente di stampare l'oggetto o di utilizzarlo con json_encode().

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

URL Components

I seguenti metodi sono disponibili per ottenere o modificare singoli componenti dell'URL:

Setter Getter Valore restituito
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 completo

Attenzione: Quando si lavora con un URL ottenuto da una richiesta HTTP, tenere presente che non conterrà il frammento, poiché il browser non lo invia al server.

Possiamo anche operare con singoli parametri di query utilizzando:

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

getDomain (int $level = 2)string

Restituisce la parte destra o sinistra dell'host. Ecco come funziona se l'host è 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

Verifica se due URL sono identici.

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

Url::isAbsolute (string $url)bool

Verifica se un URL è assoluto. Un URL è considerato assoluto se inizia con uno schema (ad esempio, http, https, ftp) seguito da due punti.

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

Url::removeDotSegments (string $path)string

Normalizza un percorso URL rimuovendo i segmenti speciali . e ... Questo metodo rimuove gli elementi ridondanti del percorso come fanno i browser.

Url::removeDotSegments('/path/../subtree/./file.txt');  // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar');                // '/foo/bar'
Url::removeDotSegments('./today/../file.txt');          // 'file.txt'

UrlImmutabile

La classe Nette\Http\UrlImmutable è un'alternativa immutabile alla classe Url (così come in PHP DateTimeImmutable è un'alternativa immutabile a DateTime). Al posto dei setter, ha i cosiddetti wither, che non modificano l'oggetto, ma restituiscono nuove istanze con un valore modificato:

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'

La classe UrlImmutable implementa l'interfaccia JsonSerializable e fornisce il metodo __toString(), che consente di stampare l'oggetto o di utilizzarlo con json_encode().

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

URL Components

I seguenti metodi sono disponibili per ottenere o modificare singoli componenti dell'URL:

Contiene Getter Valore restituito
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 completo

Il metodo withoutUserInfo() rimuove user e password.

Possiamo anche operare con i singoli parametri della query utilizzando:

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

getDomain (int $level = 2)string

Restituisce la parte destra o sinistra dell'host. Ecco come funziona se l'host è 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

Risolve un URL assoluto nello stesso modo in cui un browser elabora i collegamenti in una pagina HTML:

  • Se il link è un URL assoluto (contiene uno schema), viene utilizzato senza modifiche.
  • Se il link inizia con //, viene applicato solo lo schema dell'URL corrente.
  • Se il collegamento inizia con /, viene creato un percorso assoluto dalla radice del dominio.
  • Negli altri casi, l'URL viene costruito relativamente al percorso corrente.
$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

Controlla se due URL sono identici.

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

UrlScript

La classe Nette\Http\UrlScript è un discendente di UrlImmutable e distingue inoltre queste parti logiche dell'URL:

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

Per ottenere queste parti sono disponibili i seguenti metodi:

Getter Valore restituito
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/'

Non creiamo direttamente l'oggetto UrlScript, ma il metodo Nette\Http\Request::getUrl() lo restituisce.

versione: 4.0