Nette Documentation Preview

syntax
Analyseur et constructeur d'URL
*******************************

.[perex]
Les classes [Url |#Url], [UrlImmutable |#UrlImmutable] et [UrlScript |#UrlScript] permettent de gérer, d'analyser et de manipuler facilement les URL.

→ [Installation et exigences |@home#Installation]


Url
===

La classe [api:Nette\Http\Url] permet de travailler facilement avec l'URL et ses composants individuels, qui sont décrits dans ce diagramme :

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

La génération d'URL est intuitive :

```php
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 :

```php
$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()`.

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


URL Components .[method]
------------------------

Les méthodes suivantes permettent d'obtenir ou de modifier des composants URL individuels :

.[language-php]
| 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 |request], 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 :

.[language-php]
| Setter | Getter
|---------------------------------------------------
| `setQuery(string\|array $query)` | `getQueryParameters(): array`
| `setQueryParameter(string $name, $val)`| `getQueryParameter(string $name)`


getDomain(int $level = 2): string .[method]
-------------------------------------------
Renvoie la partie droite ou gauche de l'hôte. Voici comment cela fonctionne si l'hôte est `www.nette.org`:

.[language-php]
| `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 .[method]
-----------------------------------------------
Vérifie si deux URL sont identiques.

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


Url::isAbsolute(string $url): bool .[method]{data-version:3.3.2}
----------------------------------------------------------------
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.

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


Url::removeDotSegments(string $path): string .[method]{data-version:3.3.2}
--------------------------------------------------------------------------
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.

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


UrlImmutable .[#toc-urlimmutable]
=================================

La classe [api: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 :

```php
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()`.

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


URL Components .[method]
------------------------

Les méthodes suivantes permettent d'obtenir ou de modifier des composants URL individuels :

.[language-php]
| 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 :

.[language-php]
| Wither | Getter
|-----------------------------------------------
| `withQuery(string\|array $query)` | `getQueryParameters(): array`
| `withQueryParameter(string $name, $val)` | `getQueryParameter(string $name)`


getDomain(int $level = 2): string .[method]
-------------------------------------------
Renvoie la partie droite ou gauche de l'hôte. Voici comment cela fonctionne si l'hôte est `www.nette.org`:

.[language-php]
| `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 .[method]{data-version:3.3.2}
----------------------------------------------------------------------
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.

```php
$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 .[method]
-----------------------------------------------
Vérifie si deux URL sont identiques.

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


UrlScript .[#toc-urlscript]
===========================

La classe [api:Nette\Http\UrlScript] est un descendant de `UrlImmutable` et distingue en plus ces parties logiques de l'URL :

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

Les méthodes suivantes sont disponibles pour obtenir ces parties :

.[language-php]
| 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() |request] le renvoie.

Analyseur et constructeur d'URL

Les classes Url, UrlImmutable et UrlScript permettent de gérer, d'analyser et de manipuler facilement les URL.

Installation et exigences

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.