TigerZF
🌐Español

Capítulo 75. Zend_Uri

75.1. Zend_Uri

75.1.1. Resumen

Zend_Uri es un componente que ayuda a manipular y validar identificadores uniformes de recursos (URIs). Zend_Uri existe principalmente para dar servicio a otros componentes, como Zend_Http_Client, pero también resulta útil como utilidad independiente.

Las URI siempre comienzan con un esquema, seguido de dos puntos. La construcción de los distintos esquemas varía significativamente. La clase Zend_Uri proporciona una fábrica que devuelve una subclase de sí misma especializada en cada esquema. La subclase se denominará Zend_Uri_<scheme>, donde <scheme> es el esquema, en minúsculas con la primera letra en mayúscula. Una excepción a esta regla es HTTPS, que también es gestionado por Zend_Uri_Http.

75.1.2. Creación de una nueva URI

Zend_Uri construirá una nueva URI desde cero si solo se pasa un esquema a Zend_Uri::factory().

Ejemplo 75.1. Creación de una nueva URI con Zend_Uri::factory()

// To create a new URI from scratch, pass only the scheme.
$uri = Zend_Uri::factory('http');

// $uri instanceof Zend_Uri_Http

Para crear una nueva URI desde cero, pase únicamente el esquema a Zend_Uri::factory()[30]. Si se pasa un esquema no compatible y no se especifica una clase específica del esquema, se lanzará una Zend_Uri_Exception.

Si el esquema o la URI pasados son compatibles, Zend_Uri::factory() devolverá una subclase de sí misma especializada en el esquema que se va a crear.

75.1.2.1. Creación de una nueva URI de clase personalizada

A partir de Zend Framework 1.10.5, puede especificar una clase personalizada para usarla al crear la instancia de Zend_Uri, como segundo parámetro del método Zend_Uri::factory(). Esto le permite crear subclases de Zend_Uri y sus propias clases de URI personalizadas, e instanciar nuevos objetos URI basados en sus propias clases personalizadas.

El segundo parámetro pasado a Zend_Uri::factory() debe ser una cadena con el nombre de una clase que extienda Zend_Uri. La clase debe estar ya cargada, o poder cargarse mediante Zend_Loader::loadClass(); es decir, debe seguir las convenciones de nomenclatura de clases y archivos de Zend Framework, y debe estar en su include_path.

Ejemplo 75.2. Creación de una URI usando una clase personalizada

// Create a new 'ftp' URI based on a custom class
$ftpUri = Zend_Uri::factory(
    'ftp://user@ftp.example.com/path/file',
    'MyLibrary_Uri_Ftp'
);

// $ftpUri is an instance of MyLibrary_Uri_Ftp, which is a subclass of Zend_Uri

75.1.3. Manipulación de una URI existente

Para manipular una URI existente, pase la URI completa a Zend_Uri::factory().

Ejemplo 75.3. Manipulación de una URI existente con Zend_Uri::factory()

// To manipulate an existing URI, pass it in.
$uri = Zend_Uri::factory('http://www.zend.com');

// $uri instanceof Zend_Uri_Http

La URI será analizada y validada. Si se determina que no es válida, se lanzará inmediatamente una Zend_Uri_Exception. En caso contrario, Zend_Uri::factory() devolverá una subclase de sí misma especializada en el esquema que se va a manipular.

75.1.4. Validación de la URI

El método Zend_Uri::check() solo puede usarse si se necesita validar una URI existente.

Ejemplo 75.4. Validación de la URI con Zend_Uri::check()

// Validate whether a given URI is well formed
$valid = Zend_Uri::check('http://uri.in.question');

// $valid is TRUE for a valid URI, or FALSE otherwise.

Zend_Uri::check() devuelve un booleano, lo cual resulta más conveniente que usar Zend_Uri::factory() y capturar la excepción.

75.1.4.1. Permitir caracteres "unwise" (poco recomendables) en las URIs

Por defecto, Zend_Uri no aceptará los siguientes caracteres: "{", "}", "|", "\", "^", "`". Estos caracteres están definidos por la RFC como "unwise" (poco recomendables) y no válidos; sin embargo, muchas implementaciones sí aceptan estos caracteres como válidos.

Zend_Uri puede configurarse para aceptar estos caracteres "unwise" mediante el establecimiento de la opción 'allow_unwise' al valor booleano TRUE usando Zend_Uri::setConfig():

Ejemplo 75.5. Permitir caracteres especiales en las URIs

// Contains '|' symbol
// Normally, this would return false:
$valid = Zend_Uri::check('http://example.com/?q=this|that');

// However, you can allow "unwise" characters
Zend_Uri::setConfig(array('allow_unwise' => true));

// will return 'true'
$valid = Zend_Uri::check('http://example.com/?q=this|that');

// Reset the 'allow_unwise' value to the default FALSE
Zend_Uri::setConfig(array('allow_unwise' => false));

[Note] Nota

Zend_Uri::setConfig() establece las opciones de configuración de forma global. Se recomienda restablecer la opción 'allow_unwise' a 'FALSE', como en el ejemplo anterior, a menos que esté seguro de que desea permitir siempre caracteres "unwise" de forma global.

75.1.5. Métodos de instancia comunes

Cada instancia de una subclase de Zend_Uri (por ejemplo, Zend_Uri_Http) dispone de varios métodos de instancia que resultan útiles para trabajar con cualquier tipo de URI.

75.1.5.1. Obtener el esquema de la URI

El esquema de la URI es la parte de la URI que precede a los dos puntos. Por ejemplo, el esquema de http://www.zend.com es 'http'.

Ejemplo 75.6. Obtener el esquema de un objeto Zend_Uri_*

$uri = Zend_Uri::factory('http://www.zend.com');

$scheme = $uri->getScheme();  // "http"

El método de instancia getScheme() devuelve únicamente la parte del esquema del objeto URI.

75.1.5.2. Obtener la URI completa

Ejemplo 75.7. Obtener la URI completa de un objeto Zend_Uri_*

$uri = Zend_Uri::factory('http://www.zend.com');

echo $uri->getUri();  // "http://www.zend.com"

El método getUri() devuelve la representación en cadena de la URI completa.

75.1.5.3. Validar la URI

Zend_Uri::factory() siempre validará cualquier URI que se le pase y no instanciará una nueva subclase de Zend_Uri si se determina que la URI dada no es válida. Sin embargo, una vez que se ha instanciado la subclase de Zend_Uri para una nueva URI o una existente válida, es posible que la URI posteriormente se vuelva no válida después de ser manipulada.

Ejemplo 75.8. Validar un objeto Zend_Uri_*

$uri = Zend_Uri::factory('http://www.zend.com');

$isValid = $uri->valid();  // TRUE

El método de instancia valid() proporciona un medio para comprobar que el objeto URI sigue siendo válido.



[30] En el momento de escribir esto, Zend_Uri solo proporciona soporte integrado para los esquemas HTTP y HTTPS.