TigerZF
🌐Español

Capítulo 59. Zend_Registry

59.1. Usando el registro

Un registro es un contenedor para almacenar objetos y valores en el espacio de la aplicación. Al almacenar el valor en un registro, el mismo objeto está siempre disponible en toda su aplicación. Este mecanismo es una alternativa al uso de almacenamiento global.

El método habitual para usar registros con Zend Framework es a través de métodos estáticos en la clase Zend_Registry. Alternativamente, el registro puede utilizarse como un objeto de tipo array, de modo que puede acceder a los elementos almacenados en él con una interfaz cómoda similar a un array.

59.1.1. Estableciendo valores en el registro

Utilice el método estático set() para almacenar una entrada en el registro.

Ejemplo 59.1. Ejemplo de uso del método set()

Zend_Registry::set('index', $value);

El valor devuelto puede ser un objeto, un array o un escalar. Puede cambiar el valor almacenado en una entrada específica de el registro llamando al método set() para establecer la entrada a un nuevo valor.

El índice puede ser un escalar (NULL, cadena o número), como un array ordinario.

59.1.2. Obteniendo valores del registro

Para recuperar una entrada del registro, utilice el método estático get().

Ejemplo 59.2. Ejemplo de uso del método get()

$value = Zend_Registry::get('index');

El método getInstance() devuelve el objeto de registro singleton. Este objeto de registro es iterable, lo que hace que todos los valores almacenados en el registro sean fácilmente accesibles.

Ejemplo 59.3. Ejemplo de iteración sobre el registro

$registry = Zend_Registry::getInstance();

foreach ($registry as $index => $value) {
    echo "Registry index $index contains:\n";
    var_dump($value);
}

59.1.3. Construyendo un objeto Registry

Además de acceder al registro estático mediante métodos estáticos, puede crear una instancia directamente y utilizarla como un objeto.

La instancia del registro a la que accede a través de los métodos estáticos es simplemente una de esas instancias. Es por conveniencia que se almacena de forma estática, para que sea accesible desde cualquier parte de una aplicación.

Utilice el operador tradicional new para instanciar Zend_Registry. Instanciar Zend_Registry usando su constructor también facilita la inicialización de las entradas en el registro al tomar un array asociativo como argumento.

Ejemplo 59.4. Ejemplo de construcción de un registro

$registry = new Zend_Registry(array('index' => $value));

Una vez instanciado un objeto Zend_Registry de este tipo, puede utilizarlo llamando a cualquier método de objeto de tipo array o estableciéndolo como la instancia singleton para Zend_Registry con el método estático setInstance().

Ejemplo 59.5. Ejemplo de inicialización del registro singleton

$registry = new Zend_Registry(array('index' => $value));

Zend_Registry::setInstance($registry);

El método setInstance() lanza una Zend_Exception si el registro estático ya ha sido inicializado.

59.1.4. Accediendo al registro como un array

Si tiene varios valores que obtener o establecer, puede resultarle cómodo acceder al registro con notación de array.

Ejemplo 59.6. Ejemplo de acceso como array

$registry = Zend_Registry::getInstance();

$registry['index'] = $value;

var_dump( $registry['index'] );

59.1.5. Accediendo al registro como un objeto

También puede resultarle cómodo acceder al registro de forma orientada a objetos, utilizando los nombres de los índices como propiedades de objeto. Debe construir específicamente el objeto de registro usando la opción ArrayObject::ARRAY_AS_PROPS e inicializar la instancia estática para habilitar esta funcionalidad.

[Note] Nota

Debe establecer la opción ArrayObject::ARRAY_AS_PROPS antes de que se acceda al registro estático por primera vez.

[Warning] Problemas conocidos con la opción ArrayObject::ARRAY_AS_PROPS

Algunas versiones de PHP han demostrado ser muy problemáticas al usar el registro con la opción ArrayObject::ARRAY_AS_PROPS.

Ejemplo 59.7. Ejemplo de acceso como objeto

// in your application bootstrap:
$registry = new Zend_Registry(array(), ArrayObject::ARRAY_AS_PROPS)
Zend_Registry::setInstance($registry);
$registry->tree = 'apple';

.
.
.

// in a different function, elsewhere in your application:
$registry = Zend_Registry::getInstance();

echo $registry->tree; // echo's "apple"

$registry->index = $value;

var_dump($registry->index);

59.1.6. Consultando si existe un índice

Para averiguar si un índice concreto en el registro se ha establecido, utilice el método estático isRegistered().

Ejemplo 59.8. Ejemplo de uso del método isRegistered()

if (Zend_Registry::isRegistered($index)) {
    $value = Zend_Registry::get($index);
}

Para averiguar si un índice concreto en un array u objeto de registro tiene un valor, utilice la función isset() como lo haría con un array ordinario.

Ejemplo 59.9. Ejemplo de uso del método isset()

$registry = Zend_Registry::getInstance();

// using array access syntax
if (isset($registry['index'])) {
    var_dump( $registry['index'] );
}

// using object access syntax
if (isset($registry->index)) {
    var_dump( $registry->index );
}

59.1.7. Extendiendo el registro

El registro estático es una instancia de la clase Zend_Registry. Si desea añadir funcionalidad al registro, debe crear una clase que extienda Zend_Registry y especificar esta clase para instanciar el singleton en el registro estático. Utilice el método estático setClassName() para especificar la clase.

[Note] Nota

La clase debe ser una subclase de Zend_Registry.

Ejemplo 59.10. Ejemplo de cómo especificar el nombre de clase del registro singleton

Zend_Registry::setClassName('My_Registry');

Zend_Registry::set('index', $value);

El registro lanza una Zend_Exception si intenta establecer el nombre de clase después de que se haya accedido al registro por primera vez. Por lo tanto, se recomienda especificar el nombre de clase para su registro estático en el bootstrap de su aplicación.

59.1.8. Eliminando el registro estático

Aunque normalmente no es necesario, puede eliminar la instancia singleton del registro, si lo desea. Utilice el método estático _unsetInstance() para hacerlo.

[Warning] Riesgo de pérdida de datos

Cuando utiliza _unsetInstance(), todos los datos en el registro estático se descartan y no se pueden recuperar.

Podría usar este método, por ejemplo, si desea usar setInstance() o setClassName() después de que el objeto de registro singleton haya sido inicializado. Eliminar la instancia singleton le permite usar estos métodos incluso después de que el objeto de registro singleton haya sido establecido. Usar Zend_Registry de esta manera no se recomienda para aplicaciones y entornos típicos.

Ejemplo 59.11. Ejemplo de uso del método _unsetInstance()

Zend_Registry::set('index', $value);

Zend_Registry::_unsetInstance();

// change the class
Zend_Registry::setClassName('My_Registry');

Zend_Registry::set('index', $value);