Trabajar con URLs

Las clases Url, UrlImmutable y UrlScript permiten generar, analizar y manipular URLs fácilmente.

Instalación y requisitos

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ón
  • basePath es la parte de la ruta al directorio raíz de la aplicación
  • scriptPath es la ruta al script actual
  • relativePath es el nombre del script (posiblemente segmentos de ruta adicionales) relativo a basePath
  • relativeUrl 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.

versión: 4.0