Zend Framework: Comment supprimer une clé dans Zend_Registry?
-
03-07-2019 - |
Question
Je teste mon application Zend Framework et voudrais vérifier que quelque chose se produit lorsqu'une clé particulière n'est pas définie dans le registre. C’est la fonction que je teste:
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;
}
Comment puis-je supprimer une clé dans le registre? J'ai essayé cela, mais cela n'a pas fonctionné:
$config = Zend_Registry::get('config');
$config->__unset('domain');
Mise à jour: Ce que je veux vraiment savoir, c'est comment puis-je tester le fait que ma méthode lève une exception lorsque le champ "domaine"? La clé dans le fichier de configuration n'est pas définie.
La solution
Le seul moyen de changer la valeur de l'objet config serait de le vider d'une variable, de désélectionner l'élément en question, de demander au registre de supprimer la clé pour config, puis de le réinitialiser.
<?php
$registry = Zend_Registry::getInstance();
$config = $registry->get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>
Cependant, pour que cela fonctionne, vous devez d'abord définir l'objet Zend_Config comme éditable avant de le définir pour la première fois dans le registre.
Vous devez considérer qu’il n’est pas recommandé de modifier le registre de cette manière. En particulier, l'objet Zend_Config est conçu pour être statique une fois qu'il est instancié à l'origine.
J'espère avoir bien compris votre problème!
Autres conseils
Si votre 'configuration' est en réalité Zend_Config
, il est par défaut en lecture seule.
Le second paramètre facultatif du constructeur Zend_Config
est booléen $ allowModifications
, défini par défaut sur false
.
Vous créez probablement Zend_Config_Ini
dans bootstrap.php
avec
new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini',
APPLICATION_ENVIRONMENT)
ajouter $ allowModifications
param:
new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini',
APPLICATION_ENVIRONMENT,
true)
Essayez:
unset($config->domain);
Et ensuite ré-enregistrez $ registry- & confg
avec la classe Zend_Config
modifiée. Notez que, comme vartec l'a dit, vous devrez instancier votre instance Zend_Config
comme modifiable:
$config = new Zend_Config('filename', true);
La méthode __ unset
que vous essayez d'appeler est une méthode magique appelée lorsque vous utilisez unset
sur l'instance.
Je vois que vous essayez de supprimer une valeur dans $ config, où $ config est stocké dans Zend_Registry avant suppression. donc si supprimer la valeur n'affecte pas la valeur $ config stockée dans Zend_Registry, je suppose qu'en appelant Zend_Registry :: get (), vous avez la valeur de $ config et non une référence à la $ config dans Zend_Registry. ainsi, lorsque vous modifiez quelque chose dans $ config copié, cela n'affectera pas celui stocké. Je vous suggère de modifier d'abord la $ config, puis d'écraser la $ config dans le registre, en définissant de nouveau la $ config dans Zend_Registry.
Pour ceux qui cherchent à accomplir ce que le titre demande, désinstaller une clé 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);
}
}
}
Appelez par: Mon_Registre :: delete ('clé')