2009-03-05 2 views
4

Я тестирую приложение Zend Framework и хочу проверить, что что-то происходит, когда конкретный ключ не установлен в реестре. Это функция, которую я тестирую:Zend Framework: как отключить ключ в Zend_Registry?

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

Как отключить ключ в реестре? Я попробовал это, но это не сработало:

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

Обновление: Что я действительно хочу знать, как я должен проверить, что мой метод генерирует исключение, когда ключ «домен» в конфигурационном файле не задавать.

+0

Если вы будете следовать советам в моем ответе, это должно было дать вам тест что исключение выбрано. В противном случае, возможно, вы хотели бы принять это? – tombazza

+0

Я думаю, вы можете найти свой ответ здесь: [http://framework.zend.com/issues/browse/ZF-2752](http://framework.zend.com/issues/browse/ZF-2752) – typeoneerror

ответ

7

Единственный реальный способ изменить значение объекта конфигурации заключается в том, чтобы сбрасывать его на переменную, отключить данный элемент, попросить реестр удалить ключ для конфигурации, а затем сбросить его.

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

Однако, для этой работы вы должны были установить объект Zend_Config для редактирования, прежде чем он установлен в реестр в первый раз.

Вы должны учитывать, что изменить реестр таким образом не рекомендуется. В частности, объект Zend_Config создан как статический, как только он создается изначально.

Надеюсь, я хорошо понял вашу проблему!

+1

Я больше не работаю над этим проектом, поэтому у меня не было возможности проверить ваш ответ, поэтому я принимаю его на основании количества голосов пользователей. – Andrew

1

Если ваш 'config' на самом деле Zend_Config, то по умолчанию он доступен только для чтения. Zend_Config необязательный второй параметр конструктора имеет значение boolean $allowModifications, по умолчанию установлено значение false.

Вы, вероятно, создать Zend_Config_Ini в bootstrap.php с

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

добавить $allowModifications параметров:

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

Это точно сообщение об ошибке, которое я получаю: Zend_Registry доступен только для чтения. Мне нужен способ подделать его. Возможно, есть другой способ сделать это, вместо того, чтобы фактически «отменить» его. – Andrew

+0

Zend_Registry или Zend_Config? – vartec

0

Try:

unset($config->domain); 

А затем перерегистрировать $registry->config с модифицированным Zend_Config. Обратите внимание, что, как сказал Vartec, вы должны будете создать экземпляр Zend_Config экземпляра в редактируемом:

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

__unset метод вы пытаетесь назвать это magic method, который вызывается при использовании unset на экземпляре.

+0

unset ($ config-> domain) вызывает $ config -> __ unset ('domain'), поэтому это не имеет никакого значения. – vartec

0

Я вижу, что вы пытаетесь удалить значение в $ config, где $ config хранится в Zend_Registry перед удалением. поэтому, если удаление значения не влияет на сохраненное значение $ config в Zend_Registry, я предполагаю, что, вызывая Zend_Registry :: get(), у вас есть значение $ config, а не ссылка на $ config в Zend_Registry. поэтому, когда вы что-то изменяете в скопированной $ config, это не повлияет на сохраненную. Я предлагаю вам сначала изменить $ config, а затем перезаписать $ config в реестре, снова установив $ config в Zend_Registry.

0

Для тех, кто хочет сделать то, что просит название, чтобы сбросить ключ 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); 
     } 
    } 
} 

Позвоните по: My_Registry::delete('key')

Смежные вопросы