2010-11-24 5 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); 
    } 
} 
1

당신은, 당신은 당신이 원하는 값을 저장할 수 Zend_Config_Ini

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

을 사용할 수 있습니다 귀하의 레지스트리는 다음과 같습니다 :

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

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

     $registry = Zend_Registry::getInstance(); 

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

    } 
    } 

그런 다음 여기에서 설정 한 것과 같은 방식으로 레지스트리를 사용하여 조건에 액세스 할 수 있습니다.

; application.ini 
My.conditions.time= 50 

당신은이 같은 컨트롤러에서 사용할 수 있습니다 :

당신은 접두사로 응용 프로그램 네임 스페이스를 넣어야 할

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

: 여기

+3

이렇게하면 구성 파일을 적어도 두 번 읽는 것이 좋습니다 = 권장하지 않습니다. 이러한 값은 이미 메모리에 있습니다 (프론트 컨트롤러의 * bootstrap * param에 있음), 거기에서 값을 가져와야합니다. – takeshin

5

응용 프로그램의 Bootstrap.php$this->getOptions()를 사용하여 application.ini에 액세스 할 수 있습니다 사용할 수 있습니다 당신은 getenv('conditions.time')

http://www.php.net/manual/en/function.getenv.php

+0

부트 스트랩에서 직접 읽는 대신 레지스트리에 저장하는 것이 무엇입니까? – takeshin

+1

값이 필요할 때마다 부트 스트랩을 필요할 때마다 쉽게 사용할 수 있거나 없을 수 있습니다. 구성을 필요로하는 모든 코드가 컨트롤러에 정의되어있는 것은 아닙니다 ... – gnarf

4

는 액션 그것을위한 도우미
$config = $this->_helper->config(); 
$this->view->time = $config['conditions']['time']; 
+0

정적 노드로 작동하지 않는다는 점을 제외하면 이것은 훌륭한 도우미입니다. 가능한 경우 전면 제어기에서 부트 스트랩을 가져와야합니다. 다음으로 확인해야 할 것은 config 배열 키가 존재한다는 것입니다. – takeshin