Parser e costruttore di URL
Le classi Url, UrlImmutable e UrlScript semplificano la gestione, l'analisi e la manipolazione degli URL.
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.