Higgs proporciona una solución orientada a objetos para trabajar con URI en su aplicación. Usar esto lo hace simple para garantizar que la estructura sea siempre correcta, sin importar cuán complejo pueda ser el URI, además de agregar URI relativo a uno existente y resolverlo de forma segura y correcta.

Creando instancias de URI

Crear una instancia de URI es tan simple como crear una nueva instancia de clase.

Cuando crea la nueva instancia, puede pasar una URL completa o parcial en el constructor y se analizará. en sus secciones apropiadas:

$uri = new \Higgs\HTTP\URI('http://www.example.com/some/path');

Alternativamente, puede usar la función service() para devolverle una instancia:

$uri = service('uri', 'http://www.example.com/some/path');

Desde v7.4.0, si no pasa una URL, devuelve la URI actual:

$uri = service('uri'); // returns the current SiteURI instance.

Nota

The above code returns the SiteURI instance, that extends the URI clase. La clase URI es para URI generales, pero la clase SiteURI es para los URI de su sitio.

El URI actual

Muchas veces, todo lo que realmente desea es un objeto que represente la URL actual de esta solicitud. Puede utilizar la función current_url() disponible en Asistente de URL:

$uri = current_url(true);

Debe pasar true como primer parámetro; de lo contrario, devolverá la representación de cadena de la URL actual.

Este URI se basa en la ruta (relativa a su baseURL) según lo determinado por el objeto de solicitud actual y su configuración en Config\App (baseURL, indexPage y forceGlobalSecureRequests).

Suponiendo que estás en un controlador que extiende Higgs\Controller, También puede obtener la instancia actual de SiteURI:

$uri = $this->request->getUri();

Cadenas URI

Muchas veces, todo lo que realmente desea es obtener una representación de cadena de un URI. Esto es fácil de hacer simplemente lanzando el URI como una cadena:

<?php

$uri = current_url(true);
echo (string) $uri;  // http://example.com/index.php

Si conoce las partes del URI y solo quiere asegurarse de que todo esté formateado correctamente, puede generar una cadena usando el método estático createURIString() de la clase URI:

<?php

use Higgs\HTTP\URI;

$uriString = URI::createURIString($scheme, $authority, $path, $query, $fragment);

// Creates: http://exmample.com/some/path?foo=bar#first-heading
echo URI::createURIString('http', 'example.com', 'some/path', 'foo=bar', 'first-heading');

Importante

When URI is cast to a string, it will attempt to adjust project URLs to the configuración definida en Config\App. Si necesita la representación de cadena exacta e inalterada luego use URI::createURIString() en su lugar.

Las partes de URI

Una vez que tenga una instancia de URI, puede configurar o recuperar cualquiera de las distintas partes del URI. Esta sección proporcionará detalles sobre cuáles son esas piezas y cómo trabajar con ellas.

Esquema

El esquema suele ser “http” o “https”, pero se admite cualquier esquema, incluido “archivo”, “mailto”, etc.

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com/some/path');

echo $uri->getScheme(); // 'http'
$uri->setScheme('https');

Autoridad

Muchos URI contienen varios elementos que se conocen colectivamente como «autoridad». Esto incluye cualquier información de usuario, el host y el número de puerto. Puede recuperar todas estas piezas como una sola cadena con getAuthority() método, o puede manipular las partes individuales.

<?php

$uri = new \Higgs\HTTP\URI('ftp://user:password@example.com:21/some/path');

echo $uri->getAuthority();  // user@example.com:21

De forma predeterminada, esto no mostrará la parte de la contraseña, ya que no querrás mostrársela a nadie. Si quieres para mostrar la contraseña, puede utilizar el método showPassword(). Esta instancia de URI seguirá mostrando esa contraseña hasta que lo apagues nuevamente, así que asegúrate siempre de apagarlo tan pronto como hayas terminado:

<?php

echo $uri->getAuthority();  // user@example.com:21
echo $uri->showPassword()->getAuthority();   // user:password@example.com:21

// Turn password display off again.
$uri->showPassword(false);

Si no desea mostrar el puerto, pase true como único parámetro:

<?php

echo $uri->getAuthority(true);  // user@example.com

Nota

If the current port is the default port for the scheme it will never be displayed.

Información de usuario

La sección de información de usuario es simplemente el nombre de usuario y la contraseña que puede ver con un URI de FTP. Mientras puedas conseguir esto como parte de la Autoridad, también puedes recuperarlo tú mismo:

<?php

echo $uri->getUserInfo();   // user

De forma predeterminada, no mostrará la contraseña, pero puedes anularla con el método showPassword():

<?php

echo $uri->showPassword()->getUserInfo();   // user:password
$uri->showPassword(false);

Anfitrión

La parte del host del URI suele ser el nombre de dominio de la URL. Esto se puede configurar y recuperar fácilmente con el Métodos getHost() y setHost():

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com/some/path');

echo $uri->getHost();   // www.example.com
echo $uri->setHost('anotherexample.com')->getHost();    // anotherexample.com

Puerto

El puerto es un número entero entre 0 y 65535. Cada esquema tiene un valor predeterminado asociado.

<?php

$uri = new \Higgs\HTTP\URI('ftp://user:password@example.com:21/some/path');

echo $uri->getPort();   // 21
echo $uri->setPort(2201)->getPort(); // 2201

Cuando se utiliza el método setPort(), se comprobará que el puerto esté dentro del rango válido y se asignará.

Camino

El camino son todos los segmentos dentro del propio sitio. Como era de esperar, los métodos getPath() y setPath() se puede utilizar para manipularlo:

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com/some/path');

echo $uri->getPath();                            // '/some/path'
echo $uri->setPath('/another/path')->getPath();  // '/another/path'

Nota

When setting the path this way, or any other way the class allows, it is sanitized to encode any dangerous caracteres y elimine los segmentos de puntos por seguridad.

Nota

Since v7.4.0, the SiteURI::getRoutePath() method, devuelve la ruta URI relativa a baseURL y SiteURI::getPath() El método siempre devuelve la ruta URI completa con / inicial.

Consulta

Los datos de la consulta se pueden manipular a través de la clase utilizando representaciones de cadenas simples.

Obtener/configurar consulta

Los valores de consulta sólo pueden establecerse como una cadena actualmente.

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com?foo=bar');

echo $uri->getQuery();  // 'foo=bar'
$uri->setQuery('foo=bar&bar=baz');

El método setQuery() sobrescribe cualquier variable de consulta existente.

Nota

Query values cannot contain fragments. An InvalidArgumentException will be thrown if it does.

Configuración de consulta desde matriz

Puede establecer valores de consulta utilizando una matriz:

<?php

$uri->setQueryArray(['foo' => 'bar', 'bar' => 'baz']);

El método setQueryArray() sobrescribe cualquier variable de consulta existente.

Agregar valor de consulta

Puedes agregar un valor al colección de variables de consulta sin destruir las variables de consulta existentes con el método addQuery(). La primera El parámetro es el nombre de la variable y el segundo parámetro es el valor:

<?php

$uri->addQuery('foo', 'bar');

Filtrar valores de consulta

Puede filtrar los valores de consulta devueltos pasando una matriz de opciones al método getQuery(), ya sea con un sólo o una clave excepto:

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com?foo=bar&bar=baz&baz=foz');

// Returns 'foo=bar'
echo $uri->getQuery(['only' => ['foo']]);

// Returns 'foo=bar&baz=foz'
echo $uri->getQuery(['except' => ['bar']]);

Esto solo cambia los valores devueltos durante esta llamada. Si necesita modificar los valores de consulta del URI de forma más permanente,

Cambiar valores de consulta

puedes usar los métodos stripQuery() y keepQuery() para cambiar la colección de variables de consulta del objeto real:

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com?foo=bar&bar=baz&baz=foz');

// Leaves just the 'baz' variable
$uri->stripQuery('foo', 'bar');

// Leaves just the 'foo' variable
$uri->keepQuery('foo');

Nota

By default setQuery() and setQueryArray() methods uses native parse_str() function to prepare data. Si desea utilizar reglas más liberales (que permiten que los nombres de las claves contengan puntos), puede utilizar un método especial useRawQueryString() de antemano.

Fragmento

Los fragmentos son la parte al final de la URL, precedida por el signo de almohadilla (#). En las URL HTML estos son enlaces. a un ancla en la página. Los URI de medios pueden utilizarlos de otras maneras.

<?php

$uri = new \Higgs\HTTP\URI('http://www.example.com/some/path#first-heading');

echo $uri->getFragment();   // 'first-heading'
echo $uri->setFragment('second-heading')->getFragment();    // 'second-heading'

Segmentos URI

Cada sección del camino entre las barras es un único segmento.

Nota

In the case of your site URI, URI Segments mean only the URI path part relativo a la URL base. Si su baseURL contiene subcarpetas, los valores será diferente de la ruta URI actual.

La clase URI proporciona una forma sencilla de determinar cuáles son los valores de los segmentos. Los segmentos comienzan en 1 siendo el extremo izquierdo del camino.

<?php

// URI = http://example.com/users/15/profile

// Prints '15'
if ($uri->getSegment(1) === 'users') {
    echo $uri->getSegment(2);
}

También puede establecer un valor predeterminado diferente para un segmento en particular utilizando el segundo parámetro del método getSegment(). El valor predeterminado es una cadena vacía.

<?php

// URI = http://example.com/users/15/profile

// will print 'profile'
echo $uri->getSegment(3, 'foo');
// will print 'bar'
echo $uri->getSegment(4, 'bar');
// will throw an exception
echo $uri->getSegment(5, 'baz');
// will print 'baz'
echo $uri->setSilent()->getSegment(5, 'baz');
// will print '' (empty string)
echo $uri->setSilent()->getSegment(5);

Nota

You can get the last +1 segment. When you try to get the last +2 or más segmento, se generará una excepción de forma predeterminada. tu podrías prevenir lanzando excepciones con el método setSilent().

Puede obtener un recuento del total de segmentos:

<?php

$total = $uri->getTotalSegments(); // 3

Finalmente, puedes recuperar una matriz de todos los segmentos:

<?php

$segments = $uri->getSegments();

/*
 * Produces:
 * [
 *     0 => 'users',
 *     1 => '15',
 *     2 => 'profile',
 * ]
 */

Deshabilitar el lanzamiento de excepciones

De forma predeterminada, algunos métodos de esta clase pueden generar una excepción. Si desea desactivarlo, puede establecer una bandera especial eso evitará que se produzcan excepciones.

<?php

// Disable throwing exceptions
$uri->setSilent();

// Enable throwing exceptions (default)
$uri->setSilent(false);