Analyseur et constructeur d'URL
Les classes Url, UrlImmutable et UrlScript permettent de gérer, d'analyser et de manipuler facilement les URL.
Url
La classe Nette\Http\Url permet de travailler facilement avec l'URL et ses composants individuels, qui sont décrits dans ce diagramme :
scheme user password host port path query fragment | | | | | | | | /--\ /--\ /------\ /-------\ /--\/----------\ /--------\ /----\ http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer \______\__________________________/ | | hostUrl authority
La génération d'URL est intuitive :
use Nette\Http\Url;
$url = new Url;
$url->setScheme('https')
->setHost('localhost')
->setPath('/edit')
->setQueryParameter('foo', 'bar');
echo $url; // 'https://localhost/edit?foo=bar'
Vous pouvez également analyser l'URL, puis la manipuler :
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
La classe Url
implémente l'interface JsonSerializable
et fournit la méthode
__toString()
, ce qui permet d'imprimer l'objet ou de l'utiliser avec json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Les méthodes suivantes permettent d'obtenir ou de modifier des composants URL individuels :
Setter | Getter | Valeur retournée |
---|---|---|
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 complète |
Attention : Lorsque vous travaillez avec une URL obtenue à partir d'une requête HTTP, gardez à l'esprit qu'elle ne contiendra pas le fragment, car le navigateur ne l'envoie pas au serveur.
Nous pouvons également opérer avec des paramètres de requête individuels en utilisant :
Setter | Getter |
---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Renvoie la partie droite ou gauche de l'hôte. Voici comment cela fonctionne si l'hôte est 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
Vérifie si deux URL sont identiques.
$url->isEqual('https://nette.org');
Url::isAbsolute(string $url): bool
Vérifie si un URL est absolu. Une URL est considérée comme absolue si elle commence par un schéma (par exemple, http, https, ftp) suivi de deux points.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments(string $path): string
Normalise un chemin d'accès URL en supprimant les segments spéciaux .
et ..
. Cette méthode
supprime les éléments redondants du chemin d'accès de la même manière que le font les navigateurs.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
La classe Nette\Http\UrlImmutable est une alternative
immuable à la classe Url
(tout comme en PHP DateTimeImmutable
est une alternative immuable à
DateTime
). Au lieu de setters, elle a ce qu'on appelle des garrots, qui ne changent pas l'objet, mais retournent de
nouvelles instances avec une valeur modifiée :
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
->withUser('')
->withPassword('')
->withPath('/fr/');
echo $newUrl; // 'http://nette.org:8080/fr/?name=param#footer'
La classe UrlImmutable
implémente l'interface JsonSerializable
et fournit la méthode
__toString()
, ce qui vous permet d'imprimer l'objet ou de l'utiliser avec json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Les méthodes suivantes permettent d'obtenir ou de modifier des composants URL individuels :
Wither | Getter | Valeur retournée |
---|---|---|
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 complète |
La méthode withoutUserInfo()
supprime user
et password
.
Nous pouvons également utiliser des paramètres de requête individuels à l'aide de la méthode :
Wither | Getter |
---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain(int $level = 2): string
Renvoie la partie droite ou gauche de l'hôte. Voici comment cela fonctionne si l'hôte est 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
Résout une URL absolue de la même manière qu'un navigateur traite les liens sur une page HTML :
- Si le lien est une URL absolue (contenant un schéma), il est utilisé tel quel.
- Si le lien commence par
//
, seul le schéma de l'URL actuelle est appliqué. - Si le lien commence par
/
, un chemin absolu à partir de la racine du domaine est créé. - Dans les autres cas, l'URL est construite par rapport au chemin actuel.
$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
Vérifie si deux URL sont identiques.
$url->isEqual('https://nette.org');
UrlScript
La classe Nette\Http\UrlScript est un descendant de
UrlImmutable
et distingue en plus ces parties logiques de l'URL :
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
Les méthodes suivantes sont disponibles pour obtenir ces parties :
Getter | Valeur retournée |
---|---|
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/' |
Nous ne créons pas directement l'objet UrlScript
, mais la méthode Nette\Http\Request::getUrl() le renvoie.