Zend Framework: ¿Cómo desarmar una clave en Zend_Registry?
-
03-07-2019 - |
Pregunta
Estoy probando mi aplicación Zend Framework y me gustaría probar que algo sucede cuando una clave en particular no está establecida en el registro. Esta es la función que estoy probando:
protected function getDomainFromConfig() {
$config = Zend_Registry::get('config');
if (!isset($config->domain)) {
throw new Exception('Please make sure you have "domain" set in your config file and your config file is being set in the Zend_Registry.');
}
return $config->domain;
}
¿Cómo puedo desactivar una clave en el registro? Intenté esto, pero no funcionó:
$config = Zend_Registry::get('config');
$config->__unset('domain');
Actualización: Lo que realmente quiero saber es cómo debo probar que mi método arroja una excepción cuando el " dominio " la clave en el archivo de configuración no está establecida.
Solución
La única forma real de cambiar el valor del objeto de configuración sería volcarlo a una variable, desarmar el elemento en cuestión, pedir al registro que elimine la clave de configuración y luego restablecerlo.
<?php
$registry = Zend_Registry::getInstance();
$config = $registry->get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>
Sin embargo, para que esto funcione, deberías haber configurado el objeto Zend_Config como editable antes de que se establezca en el registro la primera vez.
Debe tener en cuenta que no es una buena práctica editar el registro de esta manera. En particular, el objeto Zend_Config está diseñado para ser estático una vez que se crea una instancia original.
¡Espero haber entendido tu problema lo suficientemente bien!
Otros consejos
Si su "configuración" es en realidad Zend_Config
, entonces, de forma predeterminada, es de solo lectura.
El segundo parámetro opcional del constructor Zend_Config
es booleano $ allowModifications
, establecido de manera predeterminada en false
.
Probablemente creas Zend_Config_Ini
en bootstrap.php
con
new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini',
APPLICATION_ENVIRONMENT)
agregue $ allowModifications
param:
new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini',
APPLICATION_ENVIRONMENT,
true)
Prueba:
unset($config->domain);
Y luego vuelva a registrar $ registry- > config
con la clase modificada Zend_Config
. Tenga en cuenta que, como dijo vartec, tendrá que crear una instancia de su instancia Zend_Config
como editable:
$config = new Zend_Config('filename', true);
El método __unset
al que intentas llamar es un método mágico al que se llama cuando usa unset
en la instancia.
Estoy viendo que está intentando eliminar un valor en $ config, donde $ config se almacena en Zend_Registry antes de la eliminación. por lo tanto, si eliminar el valor no afecta el valor almacenado de $ config en Zend_Registry, asumo que al llamar a Zend_Registry :: get () está teniendo el valor de $ config y no una referencia a la $ config en Zend_Registry. por lo tanto, cuando cambia algo en la configuración de $ copiada, no afectará a la almacenada. Le sugiero que primero cambie la configuración $, y luego sobrescriba la configuración $ en el registro, configurando la configuración $ en Zend_Registry nuevamente.
Para aquellos que buscan cumplir con lo que pide el título, para desactivar una clave Zend_Registry:
class My_Registry extends Zend_Registry
{
/**
*
* @param type $index
*/
public static function delete($index)
{
$instance = self::getInstance();
if ($instance->offsetExists($index)) {
$instance->offsetUnset($index);
}
}
}
Llame por: My_Registry::delete('key')