Nette Documentation Preview

syntax
Parser y constructor de URL
***************************

.[perex]
Las clases [Url |#Url], [UrlImmutable |#UrlImmutable] y [UrlScript |#UrlScript] facilitan el manejo, análisis y manipulación de URLs.

→ [Instalación y requisitos |@home#Installation]


Url
===

La clase [api:Nette\Http\Url] facilita el trabajo con la URL y sus componentes individuales, que se esbozan en este diagrama:

/--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 generación de URL es intuitiva:

```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'
```

También puede analizar la URL y luego manipularla:

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

Los siguientes métodos están disponibles para obtener o cambiar componentes individuales de la URL:

.[language-php]
| Setter | Getter | Valor devuelto
|--------------------------------------------------------------------------------------------
| `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 completa

Atención: Cuando trabaje con una URL obtenida de una [petición HTTP |request], tenga en cuenta que no contendrá el fragmento, ya que el navegador no lo envía al servidor.

También podemos operar con parámetros de consulta individuales utilizando:

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

El método `getDomain(int $level = 2)` devuelve la parte derecha o izquierda del host. Así funciona si el host es `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)` | `''`


La clase `Url` implementa la interfaz `JsonSerializable` y tiene un método `__toString()` para que el objeto pueda imprimirse o utilizarse en datos pasados a `json_encode()`.

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

El método `isEqual(string|Url $anotherUrl): bool` comprueba si las dos URL son idénticas.

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


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

La clase [api:Nette\Http\UrlImmutable] es una alternativa inmutable a la clase `Url` (al igual que en PHP `DateTimeImmutable` es una alternativa inmutable a `DateTime`). En lugar de setters, tiene los llamados withers, que no cambian el objeto, sino que devuelven nuevas instancias con un valor modificado:

```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('/en/');

echo $newUrl; // 'http://nette.org:8080/en/?name=param#footer'
```

Los siguientes métodos están disponibles para obtener o cambiar componentes URL individuales:

.[language-php]
| Obtener | Valor devuelto
|--------------------------------------------------------------------------------------------
| `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 completa

También podemos operar con parámetros de consulta individuales utilizando:

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

El método `getDomain(int $level = 2)` funciona igual que el método en `Url`. El método `withoutUserInfo()` elimina `user` y `password`.

La clase `UrlImmutable` implementa la interfaz `JsonSerializable` y tiene un método `__toString()` para que el objeto pueda imprimirse o utilizarse en datos pasados a `json_encode()`.

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

El método `isEqual(string|Url $anotherUrl): bool` comprueba si las dos URL son idénticas.


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

La clase [api:Nette\Http\UrlScript] es descendiente de `UrlImmutable` y distingue además estas partes lógicas de la URL:

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

Los siguientes métodos están disponibles para obtener estas partes:

.[language-php]
| Getter | Valor devuelto
|------------------------------------------------
| `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/'`


No creamos el objeto `UrlScript` directamente, sino que el método [Nette\Http\Request::getUrl() |request] lo devuelve.

Parser y constructor de URL

Las clases Url, UrlImmutable y UrlScript facilitan el manejo, análisis y manipulación de URLs.

Instalación y requisitos

Url

La clase Nette\Http\Url facilita el trabajo con la URL y sus componentes individuales, que se esbozan en este diagrama:

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

La generación de URL es 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'

También puede analizar la URL y luego manipularla:

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

Los siguientes métodos están disponibles para obtener o cambiar componentes individuales de la URL:

Setter Getter Valor devuelto
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 completa

Atención: Cuando trabaje con una URL obtenida de una petición HTTP, tenga en cuenta que no contendrá el fragmento, ya que el navegador no lo envía al servidor.

También podemos operar con parámetros de consulta individuales utilizando:

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

El método getDomain(int $level = 2) devuelve la parte derecha o izquierda del host. Así funciona si el host es 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 clase Url implementa la interfaz JsonSerializable y tiene un método __toString() para que el objeto pueda imprimirse o utilizarse en datos pasados a json_encode().

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

El método isEqual(string|Url $anotherUrl): bool comprueba si las dos URL son idénticas.

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

UrlImmutable

La clase Nette\Http\UrlImmutable es una alternativa inmutable a la clase Url (al igual que en PHP DateTimeImmutable es una alternativa inmutable a DateTime). En lugar de setters, tiene los llamados withers, que no cambian el objeto, sino que devuelven nuevas instancias con un valor modificado:

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'

Los siguientes métodos están disponibles para obtener o cambiar componentes URL individuales:

Obtener Valor devuelto
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 completa

También podemos operar con parámetros de consulta individuales utilizando:

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

El método getDomain(int $level = 2) funciona igual que el método en Url. El método withoutUserInfo() elimina user y password.

La clase UrlImmutable implementa la interfaz JsonSerializable y tiene un método __toString() para que el objeto pueda imprimirse o utilizarse en datos pasados a json_encode().

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

El método isEqual(string|Url $anotherUrl): bool comprueba si las dos URL son idénticas.

UrlScript

La clase Nette\Http\UrlScript es descendiente de UrlImmutable y distingue además estas partes lógicas de la URL:

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

Los siguientes métodos están disponibles para obtener estas partes:

Getter Valor devuelto
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/'

No creamos el objeto UrlScript directamente, sino que el método Nette\Http\Request::getUrl() lo devuelve.