2010-11-24 20 views
6

私はapplication.iniに定義されている値を持っていますapplication.iniから値を読み取る

conditions.time= 50 

どうすればzendアクションでzendアクションでそれを読むことができますか?

答えて

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

あなたはあなたがアプリケーションのBootstrap.php$this->getOptions()を使用してapplication.iniへのアクセス権を持っている、あなたはあなたが必要な値を格納することができ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']; 

    } 
    } 

ここで設定したのと同じ方法で、レジストリを使用して条件にアクセスできます。ここで

+3

これにより、設定ファイルが少なくとも2回は読み込まれるため、推奨されません。これらの値はすでにメモリに格納されているので(フロントコントローラの* bootstrap * param)、そこから値を取得する必要があります。 – takeshin

5

を使用することができますgetenv('conditions.time')

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

+0

レジストリに格納するポイントは何ですか?代わりにブートストラップから直接読み取りますか? – takeshin

+1

値が必要なときはいつでも、ブートストラップは必要な時にすぐに利用できるかもしれませんか?コンフィグレーションを必要とするすべてのコードがコントローラで定義されているわけではありません。 – gnarf

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']; 
+0

静的なものとして動作しない点を除いて、これは素晴らしいヘルパーです。可能であれば、フロントコントローラからブートストラップを取得する必要があります。次にチェックする必要があるのは、config配列キーが存在することです。 – takeshin

関連する問題