Trabajar con URLs
Las clases Url, UrlImmutable y UrlScript permiten generar, analizar y manipular URLs fácilmente.
Url
La clase Nette\Http\Url permite trabajar fácilmente con URLs y sus componentes individuales, que captura 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 URLs 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 se puede analizar una URL y manipularla posteriormente:
$url = new Url(
'http://john:xyz%2A12@nette.org:8080/en/download?name=param#footer',
);
La clase Url
implementa la interfaz JsonSerializable
y tiene un método __toString()
,
por lo que el objeto se puede imprimir o usar en datos pasados a json_encode()
.
echo $url;
echo json_encode([$url]);
Componentes de URL
Para devolver o cambiar los componentes individuales de la URL, tiene a su disposición estos 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*12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
URL completa |
Advertencia: 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 trabajar con parámetros de consulta individuales usando:
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í 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 URLs son idénticas.
$url->isEqual('https://nette.org');
Url::isAbsolute (string $url): bool
Comprueba si la URL es absoluta. Una URL se considera absoluta si comienza con 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 en la URL eliminando los segmentos especiales .
y ..
. El método elimina los
elementos redundantes de la ruta de la misma manera que lo 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 una
alternativa inmutable a la clase Url (similar a como DateTimeImmutable
en PHP es la
alternativa inmutable a DateTime
). En lugar de setters, tiene los llamados withers, que no modifican el objeto, sino
que devuelven nuevas instancias con el 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('/es/');
echo $newUrl; // 'http://john:xyz%2A12@nette.org:8080/es/?name=param#footer'
La clase UrlImmutable
implementa la interfaz JsonSerializable
y tiene un método
__toString()
, por lo que el objeto se puede imprimir o usar en datos pasados a json_encode()
.
echo $url;
echo json_encode([$url]);
Componentes de URL
Para devolver o cambiar los componentes individuales de la URL sirven los 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*12@nette.org:8080' |
|
getHostUrl(): string |
'http://john:xyz%2A12@nette.org:8080' |
|
getAbsoluteUrl(): string |
URL completa |
El método withoutUserInfo()
elimina user
y password
.
También podemos trabajar con parámetros de consulta individuales usando:
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
Deriva una URL absoluta de la misma manera que un navegador procesa los enlaces en una página HTML:
- si el enlace es una URL absoluta (contiene un esquema), se utiliza sin cambios
- si el enlace comienza con
//
, solo se toma el esquema de la URL actual - si el enlace comienza con
/
, se crea una ruta absoluta desde la raíz del dominio - en otros casos, la URL se construye relativamente 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 $anotherUrl): bool
Comprueba si dos URLs son idénticas.
$url->isEqual('https://nette.org');
UrlScript
La clase Nette\Http\UrlScript es descendiente de UrlImmutable y la extiende con componentes virtuales adicionales de la URL, como el directorio raíz del proyecto, etc. Al igual que la clase padre, es un objeto inmutable.
El siguiente diagrama muestra los componentes que UrlScript reconoce:
baseUrl basePath relativePath relativeUrl | | | | /---------------/-----\/--------\---------------------------\ http://nette.org/admin/script.php/pathinfo/?name=param#footer \_______________/\________/ | | scriptPath pathInfo
baseUrl
es la dirección URL base de la aplicación, incluido el dominio y la parte de la ruta al directorio raíz de la aplicaciónbasePath
es la parte de la ruta al directorio raíz de la aplicaciónscriptPath
es la ruta al script actualrelativePath
es el nombre del script (posiblemente segmentos de ruta adicionales) relativo a basePathrelativeUrl
es toda la parte de la URL después de baseUrl, incluida la cadena de consulta y el fragmento.pathInfo
hoy en día una parte de la URL poco utilizada después del nombre del script
Para devolver partes de la URL están disponibles los métodos:
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/' |
Los objetos UrlScript
normalmente no los creamos directamente, sino que los devuelve el método Nette\Http\Request::getUrl() con los componentes ya correctamente configurados
para la petición HTTP actual.