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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top