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',
);

Per ottenere o modificare singoli componenti dell'URL sono disponibili i seguenti metodi:

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)

Il metodo getDomain(int $level = 2) restituisce la parte destra o sinistra dell'host. Funziona così 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) ''

La classe Url implementa l'interfaccia JsonSerializable e ha un metodo __toString() che consente di stampare l'oggetto o di utilizzarlo nei dati passati a json_encode().

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

Il metodo isEqual(string|Url $anotherUrl): bool verifica se i due URL sono identici.

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

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'

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

Possiamo anche operare con singoli parametri di query utilizzando:

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

Il metodo getDomain(int $level = 2) funziona come il metodo in Url. Il metodo withoutUserInfo() rimuove user e password.

La classe UrlImmutable implementa l'interfaccia JsonSerializable e ha un metodo __toString() che consente di stampare l'oggetto o di utilizzarlo nei dati passati a json_encode().

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

Il metodo isEqual(string|Url $anotherUrl): bool verifica se i due URL sono identici.

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