ZEND Framework: Como desencadear uma chave em Zend_registry?
-
03-07-2019 - |
Pergunta
Estou testando meu aplicativo de estrutura do Zend e gostaria de testar que algo acontece quando uma chave específica não é definida no registro. Esta é a função que estou 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;
}
Como posso despertar uma chave no registro? Eu tentei isso, mas não funcionou:
$config = Zend_Registry::get('config');
$config->__unset('domain');
Atualizar: O que eu realmente quero saber é como devo testar que meu método lança uma exceção quando a tecla "Domínio" no arquivo de configuração não estiver definida.
Solução
A única maneira real de alterar o valor do objeto de configuração seria despejá -lo em uma variável, desativar o item em questão, peça ao registro para excluir a chave para configuração e depois redefini -lo.
<?php
$registry = Zend_Registry::getInstance();
$config = $registry->get('config');
unset($config->domain);
$registry->offsetUnset('config');
$registry->set('config', $config);
?>
No entanto, para que isso funcione, você teria que definir o objeto Zend_config como editável antes de ser definido no registro pela primeira vez.
Você deve considerar que não é prática recomendada editar o registro dessa maneira. Em particular, o objeto ZEND_CONFIG foi projetado para ser estático quando for instanciado originalmente.
Espero ter entendido seu problema bem o suficiente!
Outras dicas
Se a sua 'configuração' é realmente Zend_Config
, então, por padrão, é somente leitura.Zend_Config
O segundo parâmetro opcional do construtor é booleano $allowModifications
, por padrão definido como false
.
Você provavelmente cria Zend_Config_Ini
dentro bootstrap.php
com
new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini',
APPLICATION_ENVIRONMENT)
acrescentar $allowModifications
param:
new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini',
APPLICATION_ENVIRONMENT,
true)
Tentar:
unset($config->domain);
E depois se registre novamente $registry->config
com o modificado Zend_Config
classe. Observe que, como o Vartec disse, você terá que instanciar seu Zend_Config
instância como editável:
$config = new Zend_Config('filename', true);
o __unset
método que você está tentando ligar é um método mágico Isso é chamado quando você usa unset
na instância.
Estou vendo que você está tentando excluir um valor na config $, onde o $ config é armazenado em zend_registry antes da exclusão. Portanto, se a exclusão do valor não afetar o valor de configuração $ armazenado em zend_registry, presumo que, ao ligar para Zend_registry :: get (), você está tendo o valor de $ config e não uma referência à $ config em Zend_registry. Portanto, quando você muda algo na configuração copiada $, ela não afetará a armazenada. Sugiro que você altere primeiro a config $ e depois substitua a config $ no registro, definindo a $ config em zend_registry novamente.
Para aqueles que desejam realizar o que o título pede, para despertar uma chave 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);
}
}
}
Chamar pelo: My_Registry::delete('key')