2010-11-24 2 views

ответ

5

Вот мой подход, который вы можете использовать в любом месте приложения:

class My_Controller_Action_Helper_Options extends Zend_Controller_Action_Helper_Abstract 
{ 
    /** 
    * Options separator delimiterm e.g. 
    * option.subkey or 
    * option/subkey 
    */ 
    const DELIMITER = '.'; 

    /** 
    * Retrieve application options from bootstrap 
    * 
    * @return array 
    */ 
    public function getOptions() 
    { 
     $front = $this->getFrontController(); 
     $bootstrap = $front->getParam('bootstrap'); 
     if (null === $bootstrap) { 
      throw new Exception('Unable to find bootstrap'); 
     } 

     return $bootstrap->getOptions(); 
    } 

    /** 
    * Get array key if exists, otherwise returns null 
    * 
    * @param array $values 
    * @param string $key 
    * @return mixed 
    */ 
    private static function _getValue($values, $key) 
    { 
     if (is_array($values) && isset($values[$key])) { 

      return $values[$key]; 
     } 

     return null; 
    } 

    /** 
    * Get application option form bootstrap 
    * 
    * @example 
    * $options = Zend_Controller_Action_HelperBroker::getStaticHelper('options') 
    * ->get('conditions.time', 'defaultvalue'); 
    * 
    * @param string $section 
    * @param mixed $default 
    * @return Zend_Config 
    */ 
    public function get($section = null, $default = null) 
    { 
     $value = $this->getOptions(); 

     if (null !== $section && is_string($section)) { 
      if (false === strpos($section, self::DELIMITER)) { 
       $value = $this->_getValue($value, $section); 
      } else { 
       $sections = explode(self::DELIMITER, $section);   
       foreach ($sections as $section) { 
        $value = $this->_getValue($value, $section); 
        if (null === $value) { 

         break; 
        } 
       } 
      } 

     } 

     if (null === $value) { 

      return $default; 
     } 

     return $value; 
    } 

    /** 
    * @param string $section 
    * @param mixed $default 
    * @return Zend_Config 
    */ 
    public function direct($section = null, $default = null) 
    { 
     return $this->get($section, $default); 
    } 
} 
9

Вы можете использовать Zend_Config_Ini

$config = new Zend_Config_Ini('my/ini/file.ini'); 
echo $config->conditions->time; // 50 
+3

Это приводит к тому, что файл конфигурации считывается как минимум дважды = не рекомендуется. Эти значения уже находятся в памяти (в параметре * bootstrap * переднего контроллера), поэтому вы должны получить их оттуда. – takeshin 2010-11-26 23:05:52

5

приложения Bootstrap.php имеет доступ к application.ini с помощью $this->getOptions(), можно сохранить значение, которое вы хотите в ваш реестр примерно такой:

public function _initConditions() 
    { 
    $config = $this->getOptions(); 

    if (isset($config['conditions'])) 
    { 

     $registry = Zend_Registry::getInstance(); 

     $registry->conditions = $config['conditions']; 

    } 
    } 

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

+0

Какой смысл хранить в реестре, а вместо этого читать непосредственно из начальной загрузки? – takeshin 2010-11-26 23:19:55

+1

Поскольку всякий раз, когда вам нужно это значение, загрузочный лоток может быть или не быть легко доступным, когда вам это нужно? Не все коды, требующие конфигурации, определены в контроллерах ... – gnarf 2010-11-27 02:57:28

4

Вот помощник действия для этого:

class My_Controller_Action_Helper_Config 
    extends Zend_Controller_Action_Helper_Abstract 
{ 
    /** 
    * @return array 
    */ 
    public function direct() 
    { 
     $bootstrap = $this->getActionController()->getInvokeArg('bootstrap'); 
     $ns = strtolower(trim($bootstrap->getAppNamespace(), '_')); 
     return $bootstrap->getOption($ns); 
    } 
} 

Вы должны поместить пространство имен приложений в качестве префикса:

; application.ini 
My.conditions.time= 50 

Вы можете использовать его в контроллере, как это:

$config = $this->_helper->config(); 
$this->view->time = $config['conditions']['time']; 
Смежные вопросы