Domanda

Sto testando la mia applicazione Zend Framework e vorrei verificare che qualcosa accada quando una determinata chiave non è impostata nel registro. Questa è la funzione che sto testando:

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;
}

Come posso disinserire una chiave nel registro? Ho provato questo, ma non ha funzionato:

$config = Zend_Registry::get('config');
$config->__unset('domain');

Aggiornamento: ciò che voglio davvero sapere è come devo testare che il mio metodo genera un'eccezione quando il dominio " " la chiave nel file di configurazione non è impostata.

È stato utile?

Soluzione

L'unico modo reale per modificare il valore dell'oggetto config sarebbe di scaricarlo su una variabile, disinserire l'elemento in questione, chiedere al registro di eliminare la chiave per la configurazione e quindi ripristinarlo.

<?php
$registry = Zend_Registry::getInstance();
$config = $registry->get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>

Tuttavia, per funzionare, dovresti aver impostato l'oggetto Zend_Config su modificabile prima che sia impostato nel registro per la prima volta.

Dovresti considerare che non è consigliabile modificare il registro in questo modo. In particolare, l'oggetto Zend_Config è progettato per essere statico dopo essere stato istanziato in origine.

Spero di aver capito abbastanza bene il tuo problema!

Altri suggerimenti

Se il tuo 'config' è in realtà Zend_Config , per impostazione predefinita è di sola lettura. Il secondo parametro facoltativo del costruttore Zend_Config è $ allowModifications booleano, per impostazione predefinita impostato su false .

Probabilmente crei Zend_Config_Ini in bootstrap.php con

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT)

aggiungi $ allowModifications param:

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT, 
                    true)

Prova:

unset($config->domain);

E quindi registrare nuovamente $ register- > config con la classe Zend_Config modificata. Nota che, come ha detto vartec, dovrai creare un'istanza dell'istanza Zend_Config come modificabile:

$config = new Zend_Config('filename', true);

Il metodo __unset che stai tentando di chiamare è un metodo magico che viene chiamato quando si utilizza unset sull'istanza.

Sto vedendo che stai cercando di eliminare un valore in $ config, dove $ config è memorizzato in Zend_Registry prima dell'eliminazione. quindi se cancellare il valore non influenza il valore $ config memorizzato in Zend_Registry, presumo che chiamando Zend_Registry :: get () si ottenga il valore di $ config e non un riferimento a $ config in Zend_Registry. quindi quando cambi qualcosa nella $ config copiata, ciò non influirà su quello memorizzato. Ti consiglio di cambiare prima $ config, quindi sovrascrivere $ config nel registro, impostando di nuovo $ config in Zend_Registry.

Per coloro che cercano di realizzare ciò che il titolo richiede, per annullare l'impostazione di una chiave 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);
        }
    }
}

Chiama da: My_Registry::delete('key')

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top