Zend Framework: come disinserire una chiave in Zend_Registry?
-
03-07-2019 - |
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.
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')