Zend Framework: как сбросить ключ в Zend_Registry? - PullRequest
4 голосов
/ 05 марта 2009

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

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');

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

Ответы [ 5 ]

7 голосов
/ 06 марта 2009

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

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

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

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

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

1 голос
/ 05 марта 2009

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

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

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

append $allowModifications param:

new Zend_Config_Ini(APPLICATION_PATH . '/config/app.ini', 
                    APPLICATION_ENVIRONMENT, 
                    true)
0 голосов
/ 25 мая 2011

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

0 голосов
/ 05 марта 2009

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

0 голосов
/ 05 марта 2009

Попробуйте:

unset($config->domain);

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

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

Метод __unset, который вы пытаетесь вызвать, - это магический метод , который вызывается, когда вы используете unset в экземпляре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...