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',
);

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.

versión: 4.0