Parser y constructor de URL
Las clases Url, UrlImmutable y UrlScript facilitan el manejo, análisis y manipulación de URLs.
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',
);
La clase Url
implementa la interfaz JsonSerializable
y proporciona el método
__toString()
, que permite imprimir el objeto o utilizarlo con json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
Los siguientes métodos están disponibles para obtener o cambiar componentes URL individuales:
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) |
getDomain (int $level = 2): string
Devuelve la parte derecha o izquierda del host. Así es como 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 $anotherUrl): bool
Comprueba si dos URL son idénticas.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Comprueba si una URL es absoluta. Una URL se considera absoluta si comienza con un esquema (por ejemplo, http, https, ftp) seguido de dos puntos.
Url::isAbsolute('https://nette.org'); // true
Url::isAbsolute('//nette.org'); // false
Url::removeDotSegments (string $path): string
Normaliza una ruta URL eliminando los segmentos especiales .
y ..
. Este método elimina los elementos
redundantes de la ruta del mismo modo que lo hacen los navegadores.
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 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'
La clase UrlImmutable
implementa la interfaz JsonSerializable
y proporciona el método
__toString()
, que permite imprimir el objeto o utilizarlo con json_encode()
.
echo $url;
echo json_encode([$url]);
URL Components
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 |
El método withoutUserInfo()
elimina user
y password
.
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) |
getDomain (int $level = 2): string
Devuelve la parte derecha o izquierda del host. Así es como 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 del mismo modo que un navegador procesa los enlaces de una página HTML:
- Si el enlace es una URL absoluta (contiene un esquema), se utiliza sin cambios.
- Si el enlace empieza por
//
, sólo se aplica el esquema de la URL actual. - Si el enlace comienza por
/
, se crea una ruta absoluta desde la raíz del dominio. - En los demás casos, la URL se construye en relación con 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 $anotherUrl): bool
Comprueba si dos URL son idénticas.
$url->isEqual('https://nette.org');
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.