2012-02-16 6 views
4

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

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

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

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

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

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

ответ

3

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

Из Zend_Config_Ini::__constructor()docblock: -

/** 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); 

Результат

строка 'тест' (длина = 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

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

+0

В этом случае см. Мое дополнение выше – vascowhite

+0

ах, я вижу вашу проблему сейчас. Возвращаемый объект всегда является Zend_Config !! Мое второе решение не будет работать. Я попробую еще раз :) – vascowhite

0

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

$arrSettings = $oConfig->toArray(); 
$arrSettings['params']['dbname'] = 'new_value'; 
$oConfig= new Zend_Config($arrSettings); 
Смежные вопросы