Trabajar con URLs
Las clases Url, UrlImmutable y UrlScript facilitan generar, analizar y manipular URL.
Url
La clase Nette\Http\Url permite manipular con facilidad las URL y sus distintos componentes, tal y como se ve 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
Generar URL es intuitivo:
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 una URL y manipularla después:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
La clase Url implementa la interfaz JsonSerializable y tiene el método __toString(),
así que el objeto se puede imprimir o usar en los datos que se pasan a json_encode().
echo $url;
echo json_encode([$url]);
Componentes de la URL
Para obtener o modificar los distintos componentes de la URL están disponibles los siguientes métodos:
| 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 |
'john:xyz%2A12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
la URL entera |
Los métodos getUser(), getPassword(), setUser() y setPassword() están
obsoletos, porque no se recomienda incrustar las credenciales directamente en la URL.
Atención: al trabajar con una URL obtenida de una petición HTTP, tenga presente que no contendrá el fragmento, porque el navegador no lo envía al servidor.
También podemos trabajar con los distintos parámetros de consulta mediante:
| Setter | Getter |
|---|---|
setQuery(string|array $query) |
getQueryParameters(): array |
setQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
| `appendQuery(string | array $query)` |
getDomain (int $level = 2): string
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) |
'' |
isEqual (string|Url $url): bool
Comprueba si dos URL son idénticas.
$url->isEqual('https://nette.org');
canonicalize()
Convierte la URL a su forma canónica. Convierte el nombre de host a minúsculas y normaliza la ruta (codificación por porcentaje y eliminación de caracteres redundantes). La cadena de consulta se deja sin cambios.
Url::isAbsolute (string $url): bool
Comprueba si una URL es absoluta. Una URL se considera absoluta si empieza por un esquema (p. ej. http, https, ftp) seguido de dos puntos.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normaliza la ruta de una URL eliminando los segmentos especiales . y ... Este método elimina los
elementos redundantes de la ruta igual que hacen los navegadores web.
Url::removeDotSegments('/path/../subtree/./file.txt'); // '/subtree/file.txt'
Url::removeDotSegments('/../foo/./bar'); // '/foo/bar'
Url::removeDotSegments('./today/../file.txt'); // 'file.txt'
UrlImmutable
La clase Nette\Http\UrlImmutable es la alternativa
inmutable a la clase Url (de forma parecida a como DateTimeImmutable es la alternativa
inmutable a DateTime en PHP). En lugar de setters tiene “withers”, que no cambian el objeto sino que devuelven
nuevas instancias con el valor modificado:
use Nette\Http\UrlImmutable;
$url = new UrlImmutable(
'https://nette.org:8080/en/download?name=param#footer',
);
$newUrl = $url
->withHost('example.com')
->withPath('/en/')
->withQueryParameter('name', 'value');
echo $newUrl; // 'https://example.com:8080/en/?name=value#footer'
La clase UrlImmutable implementa la interfaz JsonSerializable y tiene el método
__toString(), así que el objeto se puede imprimir o usar en los datos que se pasan a
json_encode().
echo $url;
echo json_encode([$url]);
Componentes de la URL
Para obtener o cambiar los distintos componentes de la URL están disponibles los siguientes métodos:
| Wither | Getter | 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 |
'john:xyz%2A12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
la URL entera |
Los métodos getUser(), getPassword(), withUser(), withPassword() y
withoutUserInfo() están obsoletos, porque no se recomienda incrustar las credenciales directamente en la URL.
También podemos trabajar con los distintos parámetros de consulta mediante:
| Wither | Getter |
|---|---|
withQuery(string|array $query) |
getQueryParameters(): array |
withQueryParameter(string $name, $val) |
getQueryParameter(string $name) |
getDomain (int $level = 2): string
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) |
'' |
resolve (string $reference): UrlImmutable
Resuelve una URL absoluta igual que un navegador procesa los enlaces de una página HTML:
- si el enlace es una URL absoluta (contiene un esquema), se usa sin cambios
- si el enlace empieza por
//, se adopta solo el esquema de la URL actual - si el enlace empieza por
/, se crea una ruta absoluta desde la raíz del dominio - en los demás casos, la URL se construye relativa a la ruta actual
$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 $url): bool
Comprueba si dos URL son idénticas.
$url->isEqual('https://nette.org');
UrlScript
La clase Nette\Http\UrlScript es descendiente de UrlImmutable y la amplía con componentes virtuales adicionales de la URL, como el directorio raíz del proyecto, etc. Igual que su clase padre, es un objeto inmutable.
El siguiente diagrama muestra los componentes que reconoce UrlScript:
baseUrl basePath relativePath relativeUrl
| | | |
/---------------/-----\/--------\---------------------------\
http://nette.org/admin/script.php/pathinfo/?name=param#footer
\_______________/\________/
| |
scriptPath pathInfo
baseUrles la URL base de la aplicación, incluidos el dominio y la parte de la ruta hasta el directorio raíz de la aplicaciónbasePathes la parte de la ruta hasta el directorio raíz de la aplicaciónscriptPathes la ruta al script actualrelativePathes el nombre del script (y, eventualmente, más segmentos de la ruta) relativo abasePathrelativeUrles toda la parte de la URL posterior abaseUrl, incluidas la cadena de consulta y el fragmentopathInfoes una parte de la URL, hoy poco usada, posterior al nombre del script
Para obtener estas partes de la URL están disponibles los siguientes métodos:
| Getter | Valor devuelto |
|---|---|
getScriptPath(): string |
'/admin/script.php' |
getBasePath(): string |
'/admin/' |
getBaseUrl(): string |
'http://nette.org/admin/' |
getRelativePath(): string |
'script.php/pathinfo/' |
getRelativeUrl(): string |
'script.php/pathinfo/?name=param#footer' |
getPathInfo(): string |
'/pathinfo/' |
Normalmente no creamos los objetos UrlScript directamente; en su lugar, el método Nette\Http\Request::getUrl() lo devuelve con los componentes ya correctamente
establecidos para la petición HTTP actual.