Перезаписать Zend_Config и получить доступ к родительским узлам - PullRequest
4 голосов
/ 16 февраля 2012

Я хочу перезаписать метод Zend_Config __set ($ name, $ value), но у меня такая же проблема.

$ name - вернуть текущий ключ значения конфигурации перезаписи, например:

$this->config->something->other->more = 'crazy variable'; // $name in __set() will return 'more'

Поскольку каждый узел в конфигурации является новым классом Zend_Config ().

Итак, как из перезаписанного метода __set () получить доступ к именам родительских узлов?

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

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

Zend_Config доступен только для чтения, если вы не установили для $ allowModification значение true во время построения.

Из Zend_Config_Ini::__constructor() докблока : -

/** The $options parameter may be provided as either a boolean or an array.
 * If provided as a boolean, this sets the $allowModifications option of
 * Zend_Config. If provided as an array, there are three configuration
 * directives that may be set. For example:
 *
 * $options = array(
 *     'allowModifications' => false,
 *     'nestSeparator'      => ':',
 *     'skipExtends'        => false,
 *      );
 */
public function __construct($filename, $section = null, $options = false)

Это означает, чтовам нужно сделать что-то вроде этого: -

$inifile = APPLICATION_PATH . '/configs/application.ini';
$section = 'production';
$allowModifications = true;
$config = new Zend_Config_ini($inifile, $section, $allowModifications);
$config->resources->db->params->username = 'test';
var_dump($config->resources->db->params->username);

Результат

строка 'test' (длина = 4)

В ответ на комментарий

В этом случае вы можете просто расширить Zend_Config_Ini и переопределить методы __construct() и __set() следующим образом: -

class Application_Model_Config extends Zend_Config_Ini
{
    private $allowed = array();

    public function __construct($filename, $section = null, $options = false) {
        $this->allowed = array(
            'list',
            'of',
            'allowed',
            'variables'
        );
        parent::__construct($filename, $section, $options);
    }
    public function __set($name, $value) {
        if(in_array($name, $this->allowed)){
            $this->_allowModifications = true;
            parent::__set($name, $value);
            $this->setReadOnly();
        } else { parent::__set($name, $value);} //will raise exception as expected.
    }
}
0 голосов
/ 01 февраля 2017

Всегда есть другой способ:)

$arrSettings = $oConfig->toArray();
$arrSettings['params']['dbname'] = 'new_value';
$oConfig= new Zend_Config($arrSettings);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...